Як дізнатися, який файл наразі записаний процесом


9

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

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

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


Відповіді:


6

Якщо ви додасте простір до процесу саме тоді, коли він висить (ви можете отримати 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

Дякую, я не знав, що я можу приєднати напругу під час процесу. Я спробую це.
Філіп Вендлер

1
Ви можете перехрестити цю інформацію lsof -p $PID, щоб знати, де вказується дескриптор файлу
Корен

1
або ls -l /proc/pid/fdна Linux
Марно

Використовуючи strace, я фактично міг дізнатися, що саме я хотів знати, тому ще раз дякую!
Філіп Вендлер

2

У вас є кореневий доступ, я думаю, що найкращим інструментом була б підсистема аудиту . Про це не так багато літератури (але більше, ніж про loggedfs); Ви можете почати з цим уроком або через кілька прикладів або просто з auditctlлюдиною сторінкою . Тут має бути достатньо, щоб переконатися, що демон запущений, а потім запустити auditctlяк root:

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

Це записуватиме до журналів /var/log/audit/audit.logщоразу, коли процес із підпискою 1234 пише десь під /home/philipp. Накладні витрати досить невеликі, набагато менші, ніж strace.


Дякуємо, що вказали на підсистеми аудиту як цікаву альтернативу страйку. Однак це, мабуть, не допомагає тут, оскільки воно, схоже, записується лише при відкритті файлу, і тому я не можу дізнатися, скільки записано у кожен файл.
Філіп Вендлер

@PhilippWendler Ах. Хммм. Спробуйте додати -S read -S write(не перевірено).
Жил "ТАК - перестань бути злим"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.