Cómo monitorear qué archivos se abren

9

¿Existe una herramienta para monitorear qué procesos abren qué archivos en el sistema para que pueda rastrear qué proceso sigue tocando un archivo específico?

Lsof puede averiguar si lo ejecuta mientras el proceso tiene el archivo abierto, pero si es un proceso de corta duración que se ejecuta de vez en cuando, no puede detectarlo con lsof. Necesita algo que use el rastreo del kernel.

psusi
fuente
¿Has echado un vistazo a inotify? Vea la respuesta de @ Kees aquí, por ejemplo: askubuntu.com/questions/25442/… Hay un par de enlaces en mi respuesta aquí: askubuntu.com/questions/29566/…
belacqua
@jgbelacua ninguno de esos es exactamente lo que estoy buscando. Inotify puede decirle cuándo se toca un archivo determinado, y lsof puede decirle qué archivos ha abierto un proceso o qué proceso tiene un archivo abierto, pero necesito averiguar qué proceso sigue tocando un archivo y luego cerrarlo antes de que pueda ejecuta lsof para atraparlo.
psusi
Relacionado: askubuntu.com/questions/24512/…
ændrük

Respuestas:

7

Tal vez podría usar el sistema de auditoría para eso. Es un poco pesado, pero algo como esto debería funcionar (en /etc/audit/audit.rules):

# delete all other rules
-D

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

y luego creo que necesitas reiniciar auditado:

sudo service audit restart

(En caso de que no lo tenga instalado, está en el paquete auditado). El culpable se puede encontrar en /var/log/audit/audit.log.

taneli
fuente
¡Perfecto! Eso es exactamente lo que estaba buscando.
psusi
0

Desafortunadamente, el mecanismo que usa Linux para permitir que uno monitoree los archivos es inotify, que no proporciona suficiente información para extraer datos útiles: solo obtiene el nombre del archivo y la acción que se realizó.

He intentado usar algo como esto:

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

Esto escucha los eventos de inotify en el directorio especificado y para cada evento ejecuta lsof para intentar atrapar el proceso que toca el archivo. Desafortunadamente para la mayoría de los accesos que probé (como usar un editor para escribir en un archivo), el comando LSOF es lento y no logra atrapar el proceso ofensivo.

Si sus procesos hacen un IO más intenso en los archivos problemáticos, entonces su kilometraje puede variar. Buena suerte.

Guss
fuente
0

fnotifystat es una herramienta que ha sido diseñada para observar la actividad de los archivos de 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

Muestre los 10 archivos activos principales cada 60 segundos hasta que se detenga:

sudo fnotifystat -t 10 60

Muestra la actividad del archivo cada 10 segundos solo 6 veces:

sudo fnotifystat 10 6

Mostrar actividad de archivo de thunderbird e ID de proceso 1827:

sudo fnotifystat -p thunderbird,1827

Muestre cada evento de notificación de archivo y los 20 principales archivos de actividad activa en un solo período de 5 minutos:

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

Simplemente muestre cada evento de notificación de archivo en / sys y / proc y no estadísticas periódicas:

sudo fnotifystat -n -i /sys,/proc

Consulte la página de manual de fnotifystat para obtener más información, es una herramienta bastante flexible.

Colin Ian King
fuente