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

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(не проверено).
Жиль "ТАК - перестань быть злым"