1、strace工具
(1)简介
strace是一个集诊断、调试、统计于一体的工具,常用来跟踪进程执行时的系统调用和所接收的信号。在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备时,必须由用户态切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用函数,包括参数,返回值,执行消耗的时间。
(2)使用参数
-p 跟踪指定的进程
-f 跟踪由fork子进程系统调用
-F 尝试跟踪vfork子进程系统调用,与-f同时出现时,vfork不被跟踪
-o filename 将输入写入到filename文件中
-ff 常与-o选项一起使用,不同进程(子进程)产生的系统调用输出到filename.PID文件
-r 打印每一个系统调用的相对时间
-t 在输出的每一行前加上时间信息,-tt时间精确到毫秒级,还可以使用-ttt打印相对时间
-v 输出所用系统调用,默认情况下,一些频繁调用的系统调用不会输出
-s 指定每一行输出字符串的长度,默认32。文件名一致全部输出
-c 统计每种系统调用所执行的时间,调用次数,出错次数
-e expr输出过滤器,通过表达式,可以过滤掉不需要的输出内容
(3)使用示例
strace –p pid 跟踪某个后台进程
strace –o filename 输出跟踪结果到文件
strace –T 记录每个系统调用花费的时间,看看哪个系统调用时间长
strace –t(或者-tt) 记录每个系统调用发生时的时间
strace –s 1024 显示系统调用参数时,对于字符串显示的长度,默认是32,如果字符串参数很长时会显示不全
strace –e trace=nanosleep 只记录相关的系统调用信息
-e trace=network 只记录和网络api相关的系统调用
-e trace=file 只记录涉及到文件名的系统调用
-e trace=desc 只记录涉及到文件句柄的系统调用
其它还有process,ipc,signal等。
2、lsof工具
(1)简介
lsof(list open files)是一个列出当前系统打开文件的工具,在linux环境下,任何事物都以文件的形式存在,通过文件不仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议(TCP)和用户数据报协议(UDP)套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统检测以及排错将是很有帮助的。
(2)基本用法
在终端下输入lsof即可显示系统打开的文件,因为lsof需要访问核心内存和各种文件,所以必须以root用户的身份运行它才能够充分地发挥其功能。
Lsof输出各列信息的意义如下:
COMMAND:进程的名称
PID:进程标识符
USER:进程所有者
FD:文件描述符,如cwd、txt等
TYPE:文件类型,如DIR、REG等
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称
FD列中的文件描述符cwd值表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改。txt类型的文件时程序代码,如应用程序二进制文件本身或共享库。
其次数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数。u表示该文件被打开并处于读取/写入模式,而不是只读(r)或只写(w)模式。同时大写的W表示该应用程序具有对整个文件的写锁。初始打开每个应用程序时,都具有三个文件描述符,从0到2,分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的FD都是从3开始。
TYPE列比较直观,文件和目录分别称为REG和DIR。而CHR和BLK,分别表示字符和块设备。;或者UNIX、FIFO和IPv4,分别表示UNIX域套接字、先进先出(FIFO)队列和网际协议(IP)套接字。
(3)常用参数
lsof的语法格式是:
lsof [option] filename
例如:
lsof abc.txt 显示开启文件abc.txt的进程
lsof –c abc 显示abc进程现在打开的文件
lsof –c –p 1234 列出进程号为1234的进程所打开的文件
lsof –g gid 显示归属gid的进程情况
lsof +d /usr/local/ 显示目录下被进程开启的文件
lsof +D /usr/local/ 同上,但是会搜索目录下的目录,时间较长
lsof –d 4 显示使用fd为4的进程
lsof –i 用以显示符合条件的进程情况
(4)使用实例
lsof ‘which httpd’ 查看哪个进程在使用apache的可执行文件
lsof /etc/passwd 查看哪个进程在占用/etc/passwd
lsof /dev/hda6 查看哪个进程在占用hda6
lsof /dev/cdrom 查看哪个进程在占用光驱
lsof –c sendmail 查看sendmail进程的文件使用情况
lsof –c courier –u ^zahn 显示出哪些文件被以courier打头的进程打开,但不属于用户zahn的
lsof –p 30297 显示哪些文件被进程30297打开
lsof –D /tmp 显示所有在/tmp文件夹中打开的instance和文件的进程。但是symbol文件并不在列
lsof –u 1000 查看uid是1000的用户的进程的文件使用情况
lsof –u tony 查看用户tony的进程的文件使用情况
lsof –u ^tony 查看不是用户tony的进程的文件使用情况
lsof –I 查看所有打开的端口
lsof –i: 80 查看所有打开80端口的进程
lsof –i –U 查看所有打开的端口和UNIX domin文件
……