曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 6115|回复: 0
打印 上一主题 下一主题

使用 strace 捕获重定向的执行

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2012-11-18 11:12:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在一般情况下,我们用 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 出来的子进程。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-4-29 07:38 , Processed in 0.058345 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表