Cómo averiguar qué archivo está escrito actualmente por un proceso


9

Mi situación es que de vez en cuando un proceso específico (en este caso, es Thunderbird) no reacciona a la entrada del usuario durante un minuto más o menos. Descubrí que usando iotopeso durante este tiempo, escribe bastante en el disco, y ahora quiero saber en qué archivo escribe, pero desafortunadamente iotopsolo proporciona estadísticas por proceso y no por archivo abierto (descriptor).

Sé que puedo usar lsofpara averiguar qué archivos ha abierto actualmente el proceso, pero, por supuesto, Thunderbird tiene muchos de ellos abiertos, por lo que esto no es tan útil. iostatsolo muestra estadísticas por dispositivo.

El problema se produce solo al azar y puede tardar bastante tiempo en aparecer, por lo que espero no tener que atravesar Thunderbird y recorrer largos registros para averiguar qué archivo tiene la mayor cantidad de escrituras.


Respuestas:


6

Si adjunta strace al proceso justo cuando está colgado (puede obtener el pid y poner en cola el comando por adelantado, en un terminal de repuesto), mostrará el descriptor de archivo de la escritura de bloqueo.

Ejemplo trivial:

$ 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

Gracias, no sabía que podía adjuntar strace mientras se ejecuta el proceso. Intentaré esto
Philipp Wendler

1
Puede cruzar esta información con lsof -p $PID, para saber dónde apunta el descriptor de archivo
Coren

1
o ls -l /proc/pid/fden Linux
inútil

Usando strace pude descubrir exactamente lo que quería saber, ¡así que gracias de nuevo!
Philipp Wendler

2

Si tiene acceso de root, creo que la mejor herramienta sería el subsistema de auditoría . No hay mucha literatura al respecto (pero más que sobre los logfs); usted puede comenzar con este tutorial o un par de ejemplos o simplemente con la auditctlpágina de manual . Aquí, debería ser suficiente para asegurarse de que se inicia el demonio, luego se ejecuta auditctlcomo root:

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

Esto escribirá en los registros /var/log/audit/audit.logcada vez que el proceso con pid 1234 escriba en algún lugar debajo /home/philipp. La sobrecarga es bastante pequeña, mucho más pequeña que strace.


Gracias por señalar los subsistemas de auditoría como una alternativa interesante a strace. Sin embargo, no parece ayudar aquí, ya que parece que registra solo cuando se abre el archivo y, por lo tanto, no puedo averiguar cuánto se escribe en cada archivo.
Philipp Wendler

@PhilippWendler Ah. Hmmm Intenta agregar -S read -S write(no probado).
Gilles 'SO- deja de ser malvado'
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.