Linux跟踪进程访问的所有文件?

时间:2014-12-11 16:49:05

标签: linux file trace

有没有办法跟踪给定进程的所有文件I / O?我真正需要的是从给定进程读取/写入的文件的位置(理想情况下,如果它是读取或写入操作,尽管这并不重要)。

我可以运行该流程并跟踪它,而不是需要附加到现有流程,我认为这个流程要简单得多。是否有任何类型的包装器实用程序,我可以运行一个进程来监控文件访问?

4 个答案:

答案 0 :(得分:9)

尝试以此作为首发:

lsof -p <PID>

此命令将列出所有打开的文件,fd,套接字......

根据您的特殊需求,请参阅我可以提供的监控PHP脚本的解决方案:

php foo.php & _pid=$!
lsof -r1 -p $_pid
kill %1 # if you want to kill php script

作为更好的选择,我建议使用strace

strace -f -t -e trace=file php foo.php

或已经在运行的流程:

strace -f -t -e trace=file -p <PID>

答案 1 :(得分:0)

这样的事情可能会降低文件活动监控的性能影响。

$ watch -n 2.0 timeout 0.2 strace -p `pgrep myprogram` -fe trace=file

其中myprogram是进程名称,2.0是每个监视时段之间的空闲时段,0.2是监视时段的长度(以秒为单位)。

答案 2 :(得分:0)

strace是一个了不起的工具,但是它的输出有点冗长。
如果您愿意,可以使用我编写的工具来处理strace输出,并提供包含以下数据的所有访问文件的CSV报告(也是TCP套接字):
1.文件名
2.读/写字节
3.读/写操作数
4.文件打开的时间

它可以在新进程或已经运行的进程上运行(使用/ proc / fd数据)。
我发现它对于调试方案和性能分析很有用。
您可以在这里找到它:iotrace

示例输出:

Filename, Read bytes, Written bytes, Opened, Read op, Write op
/dev/pts/1,1,526512,0,1,8904
socket_127.0.0.1:47948->127.0.0.1:22,1781764,396,0,8905,11
myfile.txt,65,0,9,10,0
pipe:[3339],0,0,0,1,0

此后,您可以在Excel或其他工具中处理CSV数据以进行排序或其他所需的分析。
缺点是您需要下载和编译,而且不一定总是100%准确。

答案 3 :(得分:0)

虽然它可能无法给您足够的控制权(但是?),我编写了一个程序,该程序至少可以部分满足您的需求,它使用linux内核的fanotify和unshare来仅监视由特定进程及其子进程修改的文件。 与strace相比,它相当快(;

可以在 https://github.com/tycho-kirchner/shournal

关于外壳的示例:

$ shournal -e sh -c 'echo hi > foo1; echo hi2 > foo2'
$ shournal -q --history 1
...
  Written file(s):                                                                                                                                                                              
     /tmp/foo1 (3 bytes) Hash: 15349503233279147316                                                                                                                                             
     /tmp/foo2 (4 bytes) Hash: 2770363686119514911