有没有办法跟踪给定进程的所有文件I / O?我真正需要的是从给定进程读取/写入的文件的位置(理想情况下,如果它是读取或写入操作,尽管这并不重要)。
我可以运行该流程并跟踪它,而不是需要附加到现有流程,我认为这个流程要简单得多。是否有任何类型的包装器实用程序,我可以运行一个进程来监控文件访问?
答案 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