Как узнать, какой файл в данный момент записан процессом


9

Моя ситуация такова, что время от времени определенный процесс (в данном случае это Thunderbird) не реагирует на ввод пользователя в течение минуты или около того. Используя iotopэто, я обнаружил, что за это время он довольно много пишет на диск, и теперь я хочу выяснить, в какой файл он пишет, но, к сожалению, iotopдает только статистику по каждому процессу, а не по открытому файлу (-descriptor).

Я знаю, что могу использовать, lsofчтобы выяснить, какие файлы открыты в данный момент процессом, но, конечно, в Thunderbird их открыто много, так что это не очень полезно. iostatпоказывает только статистику по каждому устройству.

Проблема возникает случайным образом, и для ее появления может потребоваться некоторое время, поэтому я надеюсь, что мне не придется проходить через Thunderbird и просматривать длинные журналы, чтобы выяснить, какой файл содержит больше всего записей.


Ответы:


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

1
или ls -l /proc/pid/fdв Linux
бесполезно

Используя strace, я смог точно узнать, что хотел узнать, так что спасибо еще раз!
Филипп Вендлер

2

Если у вас есть root-доступ, я думаю, что лучшим инструментом будет подсистема аудита . Об этом не так много литературы (но больше, чем о loggedfs); Вы можете начать с этим уроком или через несколько примеров или просто с 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(не проверено).
Жиль "ТАК - перестань быть злым"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.