De la pregunta aquí , el OP quiere sondear repetidamente el pid de un proceso usando pidof
un script de shell. Por supuesto, esto es ineficiente ya que se debe iniciar un nuevo proceso para el pidof
programa 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 stdout
y 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 perl
script que se ejecuta repetidamente, ps
por lo que realmente no resuelve el problema. Otra opción es usar lo auditd
que 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 auditd
solución si es la mejor opción.
fuente
fork
o variante), luego el nuevo programa se inicia utilizando un miembro de laexec
familia. Por lo tanto, probablemente desee registrar elexec*
, no elfork
.dbus
).Respuestas:
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 cat
en otra terminal:Dudo que haya una forma portátil de hacer esto.
fuente
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).fuente