如何找出进程当前正在写入哪个文件

如何找出进程当前正在写入哪个文件

我的情况是,有时某个特定进程(在本例中为 Thunderbird)在一分钟左右的时间内不会对用户输入做出反应。我发现iotop在这段时间使用它,它向磁盘写入了很多内容,现在我想找出它写入哪个文件,但不幸的是iotop只提供每个进程的统计信息,而不提供每个打开文件(描述符)的统计信息。

我知道我可以用它lsof来找出进程当前打开了哪些文件,但当然 Thunderbird 打开了很多文件,所以这没有多大帮助。iostat仅显示每个设备的统计信息。

这个问题只是随机发生的,而且可能需要相当长的时间才会出现,所以我希望我不必跟踪 Thunderbird 并费力地浏览长日志来找出哪个文件的写入次数最多。

答案1

如果您在进程挂起时将 strace 附加到该进程(您可以获取 pid 并在备用终端中提前将命令排队),它将显示阻塞写入的文件描述符。

简单的例子:

$ mkfifo tmp
$ cat /dev/urandom > tmp &
[1] 636226
  # this will block on open until someone opens for reading

$ exec 4<tmp
  # now it should be blocked trying to write

$ strace -p 636226
Process 636226 attached - interrupt to quit
write(1, "L!\f\335\330\27\374\360\212\244c\326\0\356j\374`\310C\30Z\362W\307\365Rv\244?o\225N"..., 4096 <unfinished ...>
^C
Process 636226 detached

答案2

如果你有 root 访问权限,我认为最好的工具是审计子系统。关于它的文献不多(但多于关于 Loggedfs 的文献);你可以从本教程或者A 很少 例子或者只是与auditctl手册页。在这里,确保守护进程已启动就足够了,然后auditctl以 root 身份运行:

auditctl -a exit,always -F pid=1234 -F dir=/home/philipp

/var/log/audit/audit.log每次 pid 1234 的进程在 下写入某处时,这都会写入日志/home/philipp。开销相当小,比strace.

相关内容