Как следить за тем, какие файлы открываются

9

Существует ли инструмент для отслеживания того, какие процессы открывают какие файлы в системе, чтобы вы могли отследить, какой процесс продолжает касаться определенного файла?

Lsof может выяснить, запускаете ли вы его, пока у процесса открыт файл, но если это недолговечный процесс, который запускается время от времени, вы не можете перехватить его с помощью lsof. Нужно что-то, что использует трассировку ядра.

psusi
источник
Вы проверили inotify? См. Ответ @ Kees здесь, например: askubuntu.com/questions/25442/… На мой ответ есть несколько ссылок: askubuntu.com/questions/29566/…
belacqua
@jgbelacua, ни то, ни другое - это не то, что я ищу. Inotify может сообщить вам, когда к данному файлу дотронулись, и lsof может сказать вам, какие файлы открыты у процесса или какой процесс имеет открытый файл, но мне нужно выяснить, какой процесс продолжает касаться файла, а затем закрыть его, прежде чем я смогу запустить lsof, чтобы поймать его.
psusi
Связанный: askubuntu.com/questions/24512/…
rndrük

Ответы:

7

Возможно, вы могли бы использовать систему аудита для этого. Это немного тяжеловес, но что-то вроде этого должно работать (в /etc/audit/audit.rules):

# delete all other rules
-D

# watch the file in question
-w /path/to/file -p rwxa

и тогда я думаю, что вам нужно перезапустить Auditd:

sudo service audit restart

(Если он не установлен, он находится в пакете auditd.) Затем виновник может быть найден в /var/log/audit/audit.log.

Taneli
источник
Отлично! Это именно то, что я искал.
Псуси
0

К сожалению, механизм, который Linux использует для наблюдения за файлами, - это inotify, который не предоставляет достаточно информации для извлечения полезных данных: вы получаете только имя файла и действие, которое было выполнено.

Я пытался использовать что-то вроде этого:

sudo inotifywait -mr somedir --format "%w%f" | while read file; do echo -n "$file => ";lsof -b $file; echo ""; done

Он прослушивает события inotify в указанном каталоге и для каждого события запускает lsof, чтобы попытаться поймать процесс, который касается файла. К сожалению, для большинства обращений, которые я тестировал (таких как использование редактора для записи в файл), команда LSOF просто замедляет работу и не может поймать процесс, вызывающий ошибку.

Если ваши процессы выполняют более интенсивный ввод-вывод для проблемных файлов, то ваш пробег может отличаться. Удачи.

Guss
источник
0

fnotifystat - это инструмент, который был разработан для отслеживания активности файлов linux

sudo apt-get install fnotifystat
sudo fnotifystat
Total   Open  Close   Read  Write   PID  Process         Pathname
  7.0    1.0    1.0    5.0    0.0   2075 libvirtd        /proc/cpuinfo
  6.0    2.0    2.0    2.0    0.0   2075 libvirtd        /sys/devices/system/cpu/cpu0/topology/physical_package_id
  6.0    2.0    2.0    2.0    0.0   2075 libvirtd        /sys/devices/system/cpu/cpu1/topology/physical_package_id
  6.0    2.0    2.0    2.0    0.0   2075 libvirtd        /sys/devices/system/cpu/cpu2/topology/physical_package_id
  6.0    2.0    2.0    2.0    0.0   2075 libvirtd        /sys/devices/system/cpu/cpu3/topology/physical_package_id
  4.0    1.0    1.0    2.0    0.0   2075 libvirtd        /sys/devices/system/node
  4.0    1.0    1.0    2.0    0.0   2075 libvirtd        /sys/devices/system/node/node0
  4.0    2.0    2.0    0.0    0.0  15313 gnome-calendar  /usr/share/zoneinfo/Europe/London
  3.0    1.0    1.0    1.0    0.0   2075 libvirtd        /sys/devices/system/cpu/cpu0/topology/core_id
  3.0    1.0    1.0    1.0    0.0   2075 libvirtd        /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
  3.0    1.0    1.0    1.0    0.0   2075 libvirtd        /sys/devices/system/cpu/cpu1/topology/core_id
  3.0    1.0    1.0    1.0    0.0   2075 libvirtd        /sys/devices/system/cpu/cpu1/topology/thread_siblings_list
  3.0    1.0    1.0    1.0    0.0   2075 libvirtd        /sys/devices/system/cpu/cpu2/topology/core_id
  3.0    1.0    1.0    1.0    0.0   2075 libvirtd        /sys/devices/system/cpu/cpu2/topology/thread_siblings_list
  3.0    1.0    1.0    1.0    0.0   2075 libvirtd        /sys/devices/system/cpu/cpu3/topology/core_id
  3.0    1.0    1.0    1.0    0.0   2075 libvirtd        /sys/devices/system/cpu/cpu3/topology/thread_siblings_list
  3.0    1.0    1.0    1.0    0.0   2075 libvirtd        /sys/devices/system/cpu/online
  3.0    1.0    1.0    1.0    0.0   2075 libvirtd        /sys/devices/system/cpu/present
  3.0    1.0    1.0    1.0    0.0   2075 libvirtd        /sys/devices/system/node/node0/meminfo
  2.0    0.0    0.0    0.0    2.0  12174 xchat           /home/cking/.xchat2/xchatlogs/FreeNode-#ubuntu-release.log
  1.0    0.0    0.0    0.0    1.0  12174 xchat           /home/cking/.xchat2/xchatlogs/FreeNode-#ubuntu-desktop.log
  1.0    0.0    0.0    0.0    1.0  12174 xchat           /home/cking/.xchat2/xchatlogs/FreeNode-#ubuntu-devel.log
  1.0    0.0    0.0    0.0    1.0  12174 xchat           /home/cking/.xchat2/xchatlogs/FreeNode-#ubuntu-kernel.log

Покажите 10 лучших файлов каждые 60 секунд, пока не остановитесь:

sudo fnotifystat -t 10 60

Показывать активность файлов каждые 10 секунд всего 6 раз:

sudo fnotifystat 10 6

Показать активность файла thunderbird и ID процесса 1827:

sudo fnotifystat -p thunderbird,1827

Показывать каждое событие уведомления о файлах и 20 лучших файлов активности в течение 5 минут:

sudo sudo notifystat -v -d -c 5m 1

Просто покажите каждое событие уведомления файла в / sys и / proc, а не периодическую статистику:

sudo fnotifystat -n -i /sys,/proc

Обратитесь к справочной странице fnotifystat для получения дополнительной информации, это довольно гибкий инструмент.

Колин Ян Кинг
источник