如何找出进程当前写入的文件

Phi*_*ler 9 linux open-files files

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

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

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

Use*_*ess 6

如果您在进程挂起时将 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
Run Code Online (Sandbox Code Playgroud)