
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:
- El $PPID proporciona el ID del proceso padre (la persona que llama)
- elPDEl comando enumera todos los procesos.
- ElgrepEl comando busca la línea que contiene el PPID al principio de la línea.
- 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 ps
comando.
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 -p
restricción es la ps
salida al ID del proceso del padre. Le permite -o
especificar 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 ps
la información que desea.
Una vez que lo tenga, $PPID
también puede buscar en los /proc/$PPID/
"directorios" para obtener información más detallada.