time
es un comando brillante si desea calcular cuánto tiempo de CPU tarda un comando determinado.
Estoy buscando algo similar que pueda enumerar los archivos a los que accede un programa y sus hijos. Ya sea en tiempo real o como un informe posterior.
Actualmente uso:
#!/bin/bash
strace -ff -e trace=file "$@" 2>&1 | perl -ne 's/^[^"]+"(([^\\"]|\\[\\"nt])*)".*/$1/ && print'
pero falla si el comando para ejecutar implica sudo
. No es muy inteligente (sería bueno si solo pudiera enumerar archivos existentes o que tuvieran problemas de permisos o agruparlos en archivos que se leen y archivos que se escriben). También strace
es lento, por lo que sería bueno con una elección más rápida.
files
monitoring
strace
Ole Tange
fuente
fuente
strace
, supongo que está específicamente interesado en Linux. ¿Correcto?Respuestas:
Me di por vencido y codifiqué mi propia herramienta. Para citar de sus documentos:
Solo genera los archivos, por lo que no necesita tratar con la salida de
strace
.https://gitlab.com/ole.tange/tangetools/tree/master/tracefile
fuente
make && sudo make install
. Entonces puedes correrman tracefile
.yum -y install https://extras.getpagespeed.com/release-el7-latest.rpm
yyum -y install tracefile
Puede rastrear las llamadas del sistema
strace
, pero de hecho hay una penalización de velocidad inevitable. Debe ejecutarstrace
como root si el comando se ejecuta con privilegios elevados:Otro método que es probable que sea más rápido es para precargar una biblioteca que se envuelve alrededor de las funciones de acceso del sistema de archivos:
LD_PRELOAD=/path/to/libmywrapper.so mycommand
. LaLD_PRELOAD
variable de entorno no se pasará a los programas invocados con privilegios elevados. Tendría que escribir el código de esa biblioteca de envoltura ( aquí hay un ejemplo de "Crear interpositores de biblioteca para divertirse y obtener ganancias" ); No sé si hay código reutilizable disponible en la web.Si está monitoreando los archivos en una jerarquía de directorio particular, puede hacer una vista del sistema de archivos con LoggedFS de modo que todos los accesos a través de esa vista se registren.
Para configurar LoggedFS, comience con la configuración de muestra incluida con el programa y lea la sintaxis del archivo de configuración LoggedFS .
Otra posibilidad es el subsistema de auditoría de Linux . Asegúrese de que el
auditd
demonio esté iniciado, luego configure con qué desea iniciar sesiónauditctl
. Cada operación registrada se registra en/var/log/audit/audit.log
(en distribuciones típicas). Para comenzar a mirar un archivo en particular:Si coloca un reloj en un directorio, los archivos en él y sus subdirectorios también se verán de forma recursiva. Tenga cuidado de no mirar el directorio que contiene los registros de auditoría. Puede restringir el registro a ciertos procesos; consulte la
auditctl
página de manual para ver los filtros disponibles. Debe ser root para usar el sistema de auditoría.fuente
LD_PRELOAD
tampoco funcionará en binarios estáticos.Creo que quieres lsof (posiblemente canalizado a un grep en el programa y son niños). Le indicará cada archivo al que se está accediendo actualmente en el sistema de archivos. Para obtener información sobre a qué archivos se accede por proceso ( desde aquí ):
fuente
He intentado que
tracefile
. Para mí, dio muchos menos partidos que el míostrace ... | sed ... | sort -u
. Incluso agregué-s256
a lastrace(1)
línea de comando pero no ayudó mucho ...Entonces lo intenté
loggedfs
. Primero falló ya que no tenía acceso de lectura / escritura al directorio en el que intenté iniciar sesión. Después de hacer chmod 755 temporalmente, recibí algunos golpes ...Pero, para mí, hacer lo siguiente parece funcionar mejor:
inotifywait -m -r -e OPEN /path/to/traced/directory
Y luego procese el resultado después de ejecutar el proceso de interés.
Esto no detecta el acceso al proceso de archivos fuera del directorio rastreado ni tampoco sabe si algún otro proceso accedió al mismo árbol de directorios, pero en muchos casos esta es una herramienta suficientemente buena para hacer el trabajo.
EDITAR: inotifywait no captura el acceso de enlace simbólico (solo los objetivos después de que se hayan resuelto los enlaces simbólicos). Esto me golpeó cuando archivé bibliotecas a las que accedió un programa para uso futuro. Usé un poco de piratería adicional de Perl Glob para elegir los enlaces simbólicos a lo largo de las bibliotecas notificadas para hacer el trabajo en ese caso particular.
Edit2: al menos cuando inotifying archivos y enlaces simbólicos propios de línea de comandos inotifywait (por ejemplo,
inotifywait -m file symlink
oinotifywait symlink file
) de salida mostrará el acceso a cuál es el primero en la línea de comandos (sin tener en cuenta el que,file
desymlink
se accede). inotifywait no admite IN_DONT_FOLLOW, que, cuando lo intenté programáticamente, solo hace que uno vea el accesofile
(que puede o no ser lo que uno espera ...) independientemente del orden en la línea de comandosfuente
tracefile
falta de acceso a un archivo?Si bien es posible que no le brinde suficiente control (¿todavía?), He escrito un programa que satisface al menos parcialmente sus necesidades, usando fanotify y no compartido de linux-kernel para monitorear solo archivos modificados (o leídos) por un proceso específico y sus hijos . En comparación con strace, es bastante rápido (;
Se puede encontrar en https://github.com/tycho-kirchner/shournal
Ejemplo en el shell:
fuente