Imprimir pids y nombres de procesos a medida que se crean


10

De la pregunta aquí , el OP quiere sondear repetidamente el pid de un proceso usando pidofun script de shell. Por supuesto, esto es ineficiente ya que se debe iniciar un nuevo proceso para el pidofprograma varias veces por segundo (no sé si esta es la causa de los picos de CPU en la pregunta, pero parece probable).

Por lo general, la forma de evitar este tipo de cosas en un script de shell es trabajar con un solo programa que genera los datos que necesita stdouty luego hacer un procesamiento de texto si es necesario. Si bien esto implica que más programas se ejecuten simultáneamente, es probable que sea menos intensivo en CPU ya que no se crean continuamente nuevos procesos para fines de sondeo.

Entonces, para la pregunta anterior, una solución podría ser tener algún programa que genere los nombres y los pids de los procesos a medida que se crean. Entonces podrías hacer algo como:

pids-names |
  grep some_program |
  cut -f 2 |
  while read pid; do
    process-pid "$pid"
  done

El problema con esto es que plantea una pregunta más fundamental: ¿cómo pueden imprimirse los nombres de proceso y los pids a medida que se crean?

He encontrado un programa llamado ps-watcher, aunque el problema con esto es que es solo un perlscript que se ejecuta repetidamente, pspor lo que realmente no resuelve el problema. Otra opción es usar lo auditdque probablemente podría funcionar si el registro se procesó directamente a través de tail -f. Una solución ideal sería más simple y más portátil que esto, aunque aceptaré una auditdsolución si es la mejor opción.


1
Una nota al margen interesante es que el pid se crea primero como una copia del proceso de creación ( forko variante), luego el nuevo programa se inicia utilizando un miembro de la execfamilia. Por lo tanto, probablemente desee registrar el exec*, no el fork.
derobert

2
La única forma eficiente y portátil que conozco es utilizar la contabilidad de procesos ordinaria de Unix, que escribirá un registro después de que finalice un proceso. Si desea capturar procesos a medida que se crean o ejecutan, probablemente necesite cosas específicas del sistema, como Linux auditado, systemtap o dtrace.
Mark Plotnick

Entonces, para la pregunta anterior, una solución podría ser tener algún programa que genere los nombres y los pids de los procesos a medida que se crean. - ¿Como se crean? Parece que lo que estás pensando es un observador (así es como lo llaman en el mundo del navegador web). Me pregunto si Python sería adecuado para actuar como "guardia de la puerta". Los hechos son que Python puede profundizar mucho en el funcionamiento interno del sistema (por ejemplo dbus).
syntaxerror

1
@syntaxerror DBus está lejos del funcionamiento interno del sistema en este caso, en realidad se trata de dos niveles por encima de lo que se está discutiendo aquí.
Peter

OK, en la jerga OSI, el nivel discutido aquí podría ser aún más bajo que el de dbus. Admito que no había pensado en profundidad si ambos están en el mismo nivel o no.
syntaxerror

Respuestas:


6

Respuesta específica de Linux:

perf-tools contiene un execsnoop que hace exactamente esto. Utiliza varias características específicas de Linux, como ftrace. En Debian, está en el paquete perf-tools-inestable .

Ejemplo de mí corriendo man caten otra terminal:

root@Zia:~# execsnoop 
TIME        PID   PPID ARGS
17:24:26  14189  12878 man cat 
17:24:26  14196  14189 tbl 
17:24:26  14195  14189 preconv -e UTF-8 
17:24:26  14199  14189 /bin/sh /usr/bin/nroff -mandoc -Tutf8 
17:24:26  14200  14189 less 
17:24:26  14201  14199 locale charmap 
17:24:26  14202  14199 groff -mtty-char -Tutf8 -mandoc 
17:24:26  14203  14202 troff -mtty-char -mandoc -Tutf8 
17:24:26  14204  14202 grotty 

Dudo que haya una forma portátil de hacer esto.


2

There Right Way TM de hacer esto depende en gran medida de qué sistema y núcleo está ejecutando realmente. DTrace debería funcionar en Solaris, Free / NetBSD y Linux.

Para Linux específicamente, puede usar ftrace (que debe habilitarse en el momento de la compilación, generalmente lo es) o eventos de proceso a través de netlink: vea la respuesta SO al problema para obtener más detalles (y recuerde votarlo, la puntuación ~ 30 vs. 0 para la respuesta aceptada parece graciosa). El trazador del pobre probablemente podría implementarse mediante el uso strace -eexec,fork(aunque con una sobrecarga irrazonable).

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.