
¿Existe alguna forma de saber qué programa está ejecutando mi script?
Estoy ejecutando I3 como mi administrador de ventanas y quiero usarlo sxkhd
para bynd claves en lugar de i3config, pero algo sigue reemplazando mis bynds sxkhd, así que quiero rastrear qué es. Tal vez me vendría bien strace
, pero no he descubierto cómo.
Gracias por las respuestas
EDITAR:
resultó que no eliminé mis sxkhd
procesos anteriores, por lo que fueron culpables de ejecutar mi script
, pero todavía tengo curiosidad por saber cómo podría rastrear estas ejecuciones.
Respuesta1
En Linux puede obtener un PID del proceso principal desde la $PPID
variable o /proc/pid/status. El proceso principal no siempre es un proceso de llamada en el caso de demonios, por ejemplo, pero normalmente lo es. Dicho esto, puede convertir cada programa en un contenedor que primero registrará el PID de su proceso principal en un archivo y luego ejecutará un binario original. No uso sxkhd pero como usas X11, usemos xeyes como ejemplo. Cree xeyes
un script con el siguiente contenido y hágalo ejecutable:
#!/usr/bin/env sh
printf "PPID: %d\n" "$PPID" >> /tmp/XEYES_RUN
xeyes.orig "$@"
Ahora cambie el nombre de un binario xeyes original a xeyes.orig:
sudo mv "$(command -v xeyes)" "$(dirname $(command -v xeyes))"/xeyes.orig
Reemplace el original xeyes
con un contenedor de script:
sudo cp ./xeyes "$(dirname $(command -v xeyes.orig))"
Llama xeyes
normalmente:
xeyes
Ahora, cada vez que ejecute xeyes, el PID de su proceso principal se agregará a /tmp/XEYES_RUN. Si lo inicia desde la línea de comando, será el PID de su shell, por ejemplo /bin/bash.
Respuesta2
Desde el shell, en Linux:
readlink "/proc/$PPID/exe"
En cualquier shell estándar, la $PPID
variable se refiere al proceso principal. En C, puedes obtenerlo con getppid()
. La mayoría de los idiomas tienen una forma de recuperarlo (por ejemplo, getppid
en Perl, os.getppid
Python, etc.).
Una vez que obtenga el PID del proceso principal, asignarlo a un ejecutable seguramente será específico del sistema. ps
le dirá el nombre del proceso o los argumentos de la línea de comando, pero esos sonno fiable, ya que (generalmente) no incluyen la ruta completa y pueden ser modificados por el proceso mismo o por cualquier otro proceso que se ejecute con el mismo usuario.
En Linux, el ejecutable de un proceso está señalado por /proc/<pid>/exe
. Ese es un enlace simbólico "mágico": incluso si el ejecutable original fue eliminado o renombrado, aún puede leerlo (por ejemplo, para copiarlo en otro lugar) o ejecutarlo nuevamente.