我将获得一些shell脚本,我有点不知道他们将要做什么。但我需要知道脚本执行的 I / O操作(例如,他们读取/访问的文件,他们编写的文件,创建的文件夹等等)。
一个例子是使用 strace ,如下所示:
INPUT脚本: g++ -Wall a.cpp -o hello
我会将其视为: sudo strace -f -e trace=open g++ -Wall a.cpp -o hello 2> output.txt
* 我想要什么:* output.txt将有跟踪和访问过哪些文件(a.cpp和bh用于a.cpp,输出你好)
...
[pid 13871] open("a.cpp", O_RDONLY|O_NOCTTY|O_LARGEFILE) = 3
[pid 13871] open("b.h", O_RDONLY|O_NOCTTY|O_LARGEFILE) = 4
...
[pid 13874] open("hello", O_RDWR|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3
...
问题
1- strace
无法处理管道所以如果我得到mkdir d2 | cp *.c d2/
这样的命令,它只会检测到第一个命令mkdir d2
。
2- strace
提供了太多的信息,这很好,但如果某些内容更具体,那就太棒了!
我搜索了其他工具和工具,其中大部分会列出正在运行的进程的信息而我不想要那个,因为脚本会立即执行而没有任何内容将出现在Ubuntu的进程列表中。
关于如何在Ubuntu / Linux中实现这一点的任何想法?
答案 0 :(得分:4)
1)
如果我得到像mkdir d2 |这样的命令,strace不会处理管道cp * .c d2 /它只会检测第一个命令mkdir d2。
strace有两个usefult选项
-f Trace child processes as they are created by currently traced processes as a result of the fork(2) system call.
-ff If the -o filename option is in effect, each processes trace is written to filename.pid where pid is the numeric process id of each process.
你可以这样做:
strace -f -o res.txt bash -c 'mkdir d2 | cp *.c d2/'
或者你可以这样做:
strace -ff -o res.txt bash -c 'mkdir d2 | cp *.c d2/'
2)
strace提供了太多的信息,这很好但是如果某些东西更具体,那就太棒了!
有SystemTap“允许开发人员和管理员编写和重用简单的脚本来深入检查实时Linux系统的活动”。您可以编写自己的脚本,也可以使用可用的脚本。来自SystemTap网站的This is a script检测到已打开的文件:
stap your_script.stp -c "your command"