我的情况是,有时某个特定进程(在本例中为 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