¿Cómo saber qué programa está ejecutando un programa determinado?

¿Cómo saber qué programa está ejecutando un programa determinado?

¿Existe alguna forma de saber qué programa está ejecutando mi script?

Estoy ejecutando I3 como mi administrador de ventanas y quiero usarlo sxkhdpara 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 sxkhdprocesos 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 $PPIDvariable 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 xeyesun 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 xeyescon un contenedor de script:

sudo cp ./xeyes "$(dirname $(command -v xeyes.orig))"

Llama xeyesnormalmente:

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 $PPIDvariable se refiere al proceso principal. En C, puedes obtenerlo con getppid(). La mayoría de los idiomas tienen una forma de recuperarlo (por ejemplo, getppiden Perl, os.getppidPython, etc.).

Una vez que obtenga el PID del proceso principal, asignarlo a un ejecutable seguramente será específico del sistema. psle 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.

información relacionada