Cómo obtener el nombre ejecutable completo de un proceso en ejecución en Linux

Cómo obtener el nombre ejecutable completo de un proceso en ejecución en Linux

Estoy escribiendo un script que utilizará el nombre de archivo de los procesos en ejecución. Sin embargo, no puedo determinar elllenoNombre ejecutable de algunos procesos.

Inicialmente, decidí consultar la Nameentrada en /proc/PID/status(o el segundo campo en /proc/PID/stat). Sin embargo, según elpágina de manual, ese campo siempre se trunca a 15 caracteres, pero necesito el nombre completo para evitar conflictos/confusión.

una respuesta deesta preguntasugiere usar /proc/PID/cmdline, pero también hay problemas. Algunos programas (por ejemplo, chromium, electron) hacen cosas estúpidas/inteligentes con el valor, /proc/PID/cmdlinepor lo que no puedo simplemente dividir los datos NULLy obtener directamente el nombre del programa como se sugiere en la página de manual; completan muchas cosas con el original. argv[0] y sepárelos por espacio, y no creo que simplemente dividir por espacio sea una buena opción porque la ruta/nombre de archivo puede contener espacios.

Esto es aún más complicado cuando descubro que algunos scripts (por ejemplo, scripts de Python) están en formato, /usr/bin/python /path/to/scriptmientras que otros están en formato /path/to/script. Aunque esto es mucho más fácil de manejar siempre que tenga ese campo (sin atascos como arriba) y lo verifique y divida manualmente.

¿Alguna idea de cómo obtener el nombre completo del programa/archivo? No importa si el nombre contiene la ruta completa o no, porque eso se puede solucionar fácilmente (hasta donde puedo ver ahora).

Respuesta1

/proc/$PID/exeparece ser lo que estás buscando: (proc(5)

/proc/[pid]/exe
En Linux 2.2 y posteriores, este archivo es un enlace simbólico que contiene la ruta real del comando ejecutado. Este vínculo simbólico se puede desreferenciar normalmente; Al intentar abrirlo, se abrirá el ejecutable.

Tan simplemente:

$ /bin/cat & readlink /proc/$!/exe
/bin/cat

En realidad, sigue los cambios de nombre en el archivo ejecutable:

/tmp$ cp /bin/cat . ; ./cat & mv cat dog ; readlink /proc/$!/exe
/tmp/dog

Respuesta2

En una plataforma con un estándar procfscompatible con procfs-2, obtienes el resultado a través de:

ls -l /proc/<pid>/path/a.out

El archivo a.out es un enlace simbólico a la ruta absoluta del binario.

Tenga en cuenta que la pregunta no menciona Linux y por esta razón, tiene sentido brindar información sobre cómo funciona esta característica en la procfsimplementación original del inventor de procfs, Roger Faulkner.

información relacionada