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


9

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

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

该问题仅是随机发生的,它可能要花一些时间才能出现,所以我希望我不必跟踪Thunderbird并浏览冗长的日志以找出写入次数最多的文件。


Answers:


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

谢谢,我不知道进程运行时是否可以附加strace。我会尝试的。
菲利普·温德勒

1
您可以将这些信息与交叉lsof -p $PID,以了解文件描述符指向的位置
Coren 2012年

1
ls -l /proc/pid/fd在Linux上使用
没用的

使用strace我实际上可以确切地找到我想知道的内容,所以再次感谢!
菲利普·温德勒

2

我拥有root访问权,我认为最好的工具是审核子系统。关于它的文献不多(但不止于日志记录的fs)。你可以开始这个教程一个 例子,或只是与auditctl手册页。在这里,应该足以确保守护程序已启动,然后auditctl以root用户身份运行:

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

/var/log/audit/audit.log每当pid 1234的进程在下方写入时,这将写入日志/home/philipp。开销很小,比少很多strace


感谢您指出审计子系统是strace的有趣替代方案。但是,这似乎无济于事,因为它似乎仅在打开文件时才记录日志,因此我无法确定每个文件中写入了多少内容。
菲利普·温德勒

@PhilippWendler啊。嗯 尝试添加-S read -S write(未试用)。
吉尔斯(Gillles)“所以-别再邪恶了”
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.