|
在一般情况下,我们用 strace 可以跟踪命令的执行从而获得相关的系统调用细节。在 《strace 与 stdin, stdout, stderr, 管道及重定向》里也提到过,strace 的输出是从 stderr 这里送出的,因此有时我们可能会如下形式的保存 strace 的输出结果:$ strace ls tmp.txt groad.txt > file.txt 2>&1 这里,我们假设当前目录下 tmp.txt 是存在的文件,而 groad.txt 是不存在的文件。那么当上面的命令执行之后,我们打开 file.txt 时并不会发现下面的输出内容:$ ls tmp.txt groad.txt
ls: cannot access groad.txt: No such file or directory
tmp.txt 这是因为,上面的重定向符号(>) 是 shell 为 strace 命令所设,而不是为了 ls ,因此 file.txt 里不会存储 ls 的输出信息。也就是说,strace 跟踪的只是 ls tmp.txt groad.txt 这部分的命令。
那么,如果我们希望 strace 跟踪的是 ls tmp.txt groad.txt > file.txt 2>&1 那怎么办呢?
解决办法是,先在一个终端里执行:这样就获得了当前 shell 的 PID 。
接着,打开另一个 shell,执行:$ strace -o /tmp/shell.txt -f -p 2518
再接着,我们返回第 1 个 shell 里执行下面的命令:$ ls tmp.txt groad.txt > file.txt 2>&1 这样,我们就可以将上面命令的执行过程全部捕捉了下来,并保存到 /tmp/shell.txt 里面。
strace 命令中的 -p 参数接要所要跟踪程序的进程ID。-f 参数很重要,因为它可以捕捉由 -p 指定的进程所 fork 出来的子进程。 |
|