Linux进程控制--STRACE:追踪信号和系统调用
在传统的UNIX系统上,判断一个进程实际正在做什么相当困难,用户只有根据从文件系统以及ps这样的工具取得的间接数据和经验来推测,而在Linux中,用户可以通过strace命令直接观察一个进程,进程的每一次系统调用,每接收到一个信号,这个命令都能显示出来。用户还可以把strace附在一个正在执行的进程上,监视一会儿该进程,再从进程上脱离,整个过程都不会影响那个进程。
execve("/usr/bin/top", ["top"], [/* 30 vars */]) = 0
brk(0) = 0x922a000
…………
gettimeofday({1268710722, 9547}, {0, 0}) = 0
stat64("/proc/self/task", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
open("/proc", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3
fcntl64(3, F_GETFD) = 0x1 (flags FD_CLOEXEC)
getdents(3, /* 154 entries */, 32768) = 2708
stat64("/proc/1", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
open("/proc/1/stat", O_RDONLY) = 4
read(4, "1 (init) S 0 1 1 0 -1 4202752 16"..., 1023) = 199
close(4) = 0
open("/proc/1/statm", O_RDONLY) = 4
read(4, "507 222 168 33 0 70 0\n", 1023) = 22
close(4) = 0
socket(PF_FILE, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 4
connect(4, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
close(4) = 0
socket(PF_FILE, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 4
connect(4, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
close(4) = 0
open("/etc/nsswitch.conf", O_RDONLY) = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=1696, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb777e000
read(4, "#\n# /etc/nsswitch.conf\n#\n# An ex"..., 4096) = 1696
read(4, "", 4096) = 0
close(4) = 0
…………
以上记录了从调用top命令开始,top命令运行期间,至top命令结束时所有的调用过程。
也可以用#strace –p 1940 (1940是top进程的PID) 命令来附加到正在运行的进程上来查看其状态。
由于结果数据量较大,在终端上无法显示完整信息,可将其结果保存至文件,再查看。# strace –o a.txt top
但不能这样用: strace top >a.txt 这样只会将top命令的结果存入a.txt。