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 Name
entrada 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/cmdline
por lo que no puedo simplemente dividir los datos NULL
y 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/script
mientras 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/exe
parece 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 procfs
compatible 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 procfs
implementación original del inventor de procfs, Roger Faulkner.