¿Cómo puedo saber la ruta absoluta de un proceso en ejecución?

93

Si tengo varias copias de la misma aplicación en el disco, y solo una se está ejecutando, como puedo ver ps, ¿cómo puedo saber la ruta absoluta para distinguirla de las otras?

Jader Dias
fuente

Respuestas:

110
% sudo ls -l /proc/PID/exe

p.ej:

% ps -auxwe | grep 24466
raíz 24466 0.0 0.0 1476 280? S 2009 0:00 supervisar sshd
% sudo ls -l / proc / 24466 / exe
lrwxrwxrwx 1 raíz raíz 0 1 de febrero 18:05 / proc / 24466 / exe -> /package/admin/daemontools-0.76/command/supervise
akira
fuente
1
En mi sistema (ubuntu 14.04) no es necesario ser superusuario para ejecutar el lscomando.
jarno
3
@jarno ls: cannot read symbolic link /proc/28783/exe: Permission denied: no se trata de ejecutar el lscomando, se trata de acceder a la información del proceso de un proceso que no le pertenece. En mi cuadro, aproximadamente el 97% de todos los procesos enumerados en / proc son procesos raíz, y los otros se distribuyen en 11 usuarios diferentes.
Irfy
20

Utilizar:

pwdx $pid

Esto le proporciona el directorio de trabajo actual del pid, no su ruta absoluta.

Por lo general, el whichcomando le indicará qué se invoca desde el shell:

#> which vlc
/usr/bin/vlc
seenu
fuente
3
esta respuesta necesita más
votos positivos
8
@Kokizzu No, no lo hace porque no responde la pregunta en absoluto. El comando which solo le dice qué binario se ejecutará si ejecuta el comando ahora. La pregunta era "qué binario ya se está ejecutando allí". Imagine, por ejemplo, tener una docena de jdks en su computadora. Si desea saber para un proceso java en ejecución de qué jdk se ha tomado, lo que no lo ayuda con eso. Solo le dirá de qué jdk se tomará, si lo ejecuta ahora. La respuesta aceptada es también la correcta.
noamik
Una forma obvia de esta respuesta es incorrecta: en mi máquina ejecuto procesos con diferentes versiones de JDK y algunos 32 bits / 64 bits. Si deseo identificar la versión correcta de jstack / jmap para el proceso, la respuesta anterior no funcionará mientras que la respuesta aceptada sí.
Daniel Da Cunha
@Kokizzu Esto solo responde a la pregunta, "¿Cuál es el directorio de trabajo actual del proceso $pid?" La publicación editada aún no responde la pregunta. whichsimplemente dice "Si el comando está en el camino, entonces, ¿qué es?"
John Strood
pwdxdevuélvame el camino absoluto del programa ejecutable del proceso dependiendo de pid en redhat x64 6.3.
Nick Dong
14

Una forma es ps -ef

fpmurphy
fuente
55
no funcionó para un servicio específico, solo proporcionó la ruta relativa
Jader Dias
Me ayudó a identificar un proceso a través del comando con el que se inició.
jpierson
2

La respuesta rápida es usar las psopciones o la /procinformación del sistema de archivos. Eso generalmente funcionará, pero no está garantizado. En general, no hay una respuesta definitiva y garantizada. Por ejemplo, ¿qué sucede si el archivo en ejecución se elimina durante la ejecución, de modo que no haya una ruta al archivo?

Consulte las Preguntas frecuentes de Unix para obtener un poco más de detalle, en particular las preguntas 4.3 y 4.4.

mpez0
fuente
2

¿Por qué todos esperan que sepas el PID? Aquí está la forma amigable para los humanos:

pwdx `pgrep ###process_name###`
humor
fuente
La pregunta dice "como puedo ver con ps", por lo que probablemente mostrará el PID
Scz
Ah ok cierto. Todavía encuentro que este es un revestimiento más rápido en muchos de mis casos de uso.
moodboom
1

lsof es una opción. Puedes probar algo como a continuación:

lsof -p PROCESS_ID

Esto enumerará todos los archivos abiertos por el proceso, incluida la ubicación real del ejecutable. Entonces es posible agregar un poco más de awk, cut, grep, etc. para encontrar la información que está buscando.

Como ejemplo, ejecuté los siguientes comandos para identificar de dónde vino mi proceso 'java':

lsof -p 12345 | awk '{print $ NF}' | grep 'java $'

RAM
fuente
¿Cómo es esto diferente de las respuestas ya publicadas exactamente?
Pimp Juice IT
0

Podrías usar

readlink /proc/$(pgrep -x -U $(id -ur) APP_NAME)/exe

o

find /proc/$(pgrep -x -U $(id -ur) APP_NAME)/exe -printf "%l\n"

para obtener el camino absoluto. PID es el proceso.

jarno
fuente