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

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

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

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

  • Что вы фильтруете / исключаете список при выполнении резервного копирования с помощью rsync?
  • Как копировать файлы только в папку назначения, находящуюся в папке из источника, все остальное не нужно копировать
  • Удалить все «nohup.out» в рекурсивном каталоге
  • Создание пустого файла с именем переменной в скрипте
  • Почему ошибки OS X `install` на перенаправленном входе, когда одна и та же версия` install` на linux работает нормально?
  • Возможно ли обновлять измененные времена только без копирования файлов при использовании rsync?
  • Приоритет пользователя и владельца группы в разрешении файлов
  • Сценарий оболочки Crontabbed, не способный создавать / записывать в файл
  • 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 - лучшая ОС в мире.