Seguimiento de llamada bash de Linux

Seguimiento de llamada bash de Linux

Me preguntaba si hay alguna manera de rastrear desde dónde se ejecutó un comando en Linux.

Por ejemplo, si llamo a un script, ¿hay alguna forma de rastrear desde dónde se llamó, como si se inició desde un programa u otro script bash?

Respuesta1

Si su secuencia de comandos está escrita en bash, hay una variable incorporada llamada $PPID (abreviatura de ID de proceso principal, supongo) que puede usar para averiguar quién llamó a su secuencia de comandos. Aquí hay un ejemplo:

CALLER=$(ps ax | grep "^ *$PPID" | awk '{print $NF}')
echo I was called from $CALLER

Explicación:

  1. El $PPID proporciona el ID del proceso padre (la persona que llama)
  2. elPDEl comando enumera todos los procesos.
  3. ElgrepEl comando busca la línea que contiene el PPID al principio de la línea.
  4. ElawkEl comando imprime solo la última columna, que es el nombre de la persona que llama.

Respuesta2

"Eraejecutar desde" es bastante difícil, creo, a menos que haya algún registro en el ejecutable que se ejecutó. Si la ejecución finaliza, probablemente no quede mucho por investigar.

Si seesAl ejecutarse, es posible que pueda obtener suficiente información sobre la persona que llama a partir del ID del proceso principal (PPID) simplemente usando ps.

Respuesta3

Si el proceso aún se está ejecutando, puede utilizar la visualización jerárquica (llamada también bosque o árbol de procesos) que ofrece el pscomando.

Pruebe por ejemplo:

ps xf

Y el resultado se verá así:

 3627 ?        Ss     0:00 /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
 3655 ?        S      0:38  \_ bwm --interface eth0 --download
 3656 ?        S      0:38  \_ bwm --interface eth0 --upload
 3687 ?        S      0:20  \_ /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
  574 ?        S      0:00  |   \_ sleep 1
 3713 ?        S      0:00  \_ wmiir read /event
 3714 ?        S      0:00  \_ /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
22671 ?        S      0:00      \_ /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
22672 ?        Ss     0:03          \_ xterm
22673 pts/0    Ss+    0:00              \_ bash

Respuesta4

Una posible actualización de la respuesta de Hai Vu:

ps -p $PPID -o args=

La -prestricción es la pssalida al ID del proceso del padre. Le permite -oespecificar su propia salida y, en este caso, tengo args=cuál (para mí, me da lo que estoy buscando). La posible mejora es que en lugar de obtener mucha información y luego intentar analizarla, solo solicite psla información que desea.

Una vez que lo tenga, $PPIDtambién puede buscar en los /proc/$PPID/"directorios" para obtener información más detallada.

información relacionada