曲径通幽论坛

标题: 使用 strace 捕获重定向的执行 [打印本页]

作者: beyes    时间: 2012-11-18 11:12
标题: 使用 strace 捕获重定向的执行
在一般情况下,我们用 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 那怎么办呢?

解决办法是,先在一个终端里执行:
$ echo $$
2518
这样就获得了当前 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 出来的子进程。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2