如何实时监视进程的打开文件?


41

我知道我可以lsof 及时在Linux机器上使用来查看进程的打开文件。但是,进程可以如此快速地打开,更改和关闭文件,以致在使用标准外壳脚本(例如watch监视文件时,我无法看到它,如“在Linux上监视打开的进程文件(实时)”中所述。

因此,我认为我正在寻找一种简单的方法来审核流程,并查看经过一段时间后所做的工作。如果还可以查看(尝试)建立了哪些网络连接并在没有时间开始审核之前有时间运行审核,则可以开始审核。

理想情况下,我想这样做:

sh $ audit-lsof /path/to/executable
4530.848254 OPEN  read  /etc/myconfig
4530.848260 OPEN  write /var/log/mylog.log
4540.345986 OPEN  read  /home/gert/.ssh/id_rsa          <-- suspicious
4540.650345 OPEN  socket TCP ::1:34895 -> 1.2.3.4:80    |
[...]
4541.023485 CLOSE       /home/gert/.ssh/id_rsa          <-- would have missed
4541.023485 CLOSE socket TCP ::1:34895 -> 1.2.3.4:80    |   this when polling

使用strace和一些标志看不到每个系统调用是否可能?


Answers:


50

运行它

strace -e trace=open,close,read,write,connect,accept your-command-here

可能就足够了。

-o如果该进程可以打印到stderr,则需要使用该选项将strace的输出放置在控制台以外的其他位置。如果您的流程分叉,则还需要-f-ff

哦,你可能想-t为好,所以你可以看到,当呼叫发生。


请注意,您可能需要根据您的处理过程来调整函数调用列表-我需要添加getdents例如,以使用ls以下方法获得更好的示例:

$ strace -t -e trace=open,close,read,getdents,write,connect,accept ls >/dev/null
...
09:34:48 open("/etc/ld.so.cache", O_RDONLY) = 3
09:34:48 close(3)                       = 0
09:34:48 open("/lib64/libselinux.so.1", O_RDONLY) = 3
09:34:48 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@V\0\0\0\0\0\0"..., 832) = 832
09:34:48 close(3)                       = 0
...
09:34:48 open("/proc/filesystems", O_RDONLY) = 3
09:34:48 read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 1024) = 366
09:34:48 read(3, "", 1024)              = 0
09:34:48 close(3)                       = 0
09:34:48 open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
09:34:48 close(3)                       = 0
09:34:48 open(".", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
09:34:48 getdents(3, /* 5 entries */, 32768) = 144
09:34:48 getdents(3, /* 0 entries */, 32768) = 0
09:34:48 close(3)                       = 0
09:34:48 write(1, "file-A\nfile-B\nfile-C\n", 21) = 21
09:34:48 close(1)                       = 0
09:34:48 close(2)                       = 0

1
朝正确的方向前进,谢谢!想要更人性化的输出,但是可以完成工作。为此,我可能会花一些时间编写一个具有更像顶部的界面的工具。我希望能够使用基于ncurses或“ top”的工具来实时检查二进制文件的动作。
gertvdijk 2012年

您希望它看起来如何?可能会将strace输出修改为更友好的名称。
没用的

您肯定要使用-o将输出推送到文件。然后,您可以tail -F strace.output在另一个终端中运行以获取“实时”更新。
peterph

4
您还可以strace使用该-p PID选项附加到正在运行的进程。
Frank Breitling

添加-y到“与文件描述符参数关联的[p] rint路径”
ricab
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.