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

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

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

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

  • Как правильно и легко настроить `xdg-open` без какой-либо среды?
  • Как редактировать / etc / inittab?
  • Перемещение, копирование и преобразование имен файлов
  • Как найти исполняемые файлы в каталоге
  • Добавить расширение в список файлов
  • Извлеките путь к каталогу, содержащий файл с соответствующей строкой
  • Могу ли я переместить каталог с открытыми файлами?
  • изменить формат файла при использовании stat
  • 2 Solutions collect form web for “Как узнать, какой файл в настоящее время записывается процессом”

    Если вы прикрепляете 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 

    У меня есть root-доступ, я считаю, что лучшим инструментом будет подсистема аудита . Об этом мало литературы (но больше, чем о loggedfs); вы можете начать с этого руководства или нескольких примеров или просто с помощью страницы auditctl man . Здесь должно быть достаточно, чтобы убедиться, что демон запущен, а затем запустите auditctl как root:

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

    Это будет записываться в журналы /var/log/audit/audit.log каждый раз, когда процесс с pid 1234 записывается где-то под /home/philipp . Накладные расходы довольно малы, намного меньше, чем strace .

    Linux и Unix - лучшая ОС в мире.