Pregunta Si conozco el número PID de un proceso, ¿cómo puedo obtener su nombre?


Si tengo el número PID para un proceso (en una máquina UNIX), ¿cómo puedo averiguar el nombre de su proceso asociado?

¿Que tengo que hacer?


205


origen


Puedes usar ps o ls -l /proc/$PID/exe - Eddy_Em
@ Eddy_Em que le dará el archivo ejecutable, que no siempre es el nombre del proceso. Además, eso no es portátil ... - derobert
ps -fp PID mostrará el comando completo - Temak


Respuestas:


En todos los sistemas compatibles con POSIX, y con Linux, puede usar ps:

ps -p 1337 -o comm=

Aquí, el proceso es seleccionado por su PID con -p. los -o La opción especifica el formato de salida comm es decir, el nombre del comando.

Ver también: ps - Las especificaciones de la base Open Group Edición 6


222



comm parece truncar el comando a 15 caracteres. Utilizando command en cambio lo arregla. - Nemo
[Ubuntu 14.04.4 LTS] $ ps -p 1 -o comm=  en eso $ ps -p 1 -o command=  / sbin / init; lo que significa que no tiene alrededor de 15 caracteres, tal vez solo el nombre del binario frente a su ruta completa. - OmarOthman
Actualmente, comm da el nombre del binario y command devuelve el argumento 0 - robbie0630


Puede encontrar el nombre del proceso o el comando utilizado por el id de proceso o pid desde

/proc/pid/cmdline

haciendo

cat /proc/pid/cmdline

Aquí pid es el pid para el que desea encontrar el nombre
Por ejemplo:

 # ps aux

   ................
   ................
   user  2480  0.0  1.2 119100 12728 pts/0  Sl   22:42   0:01 gnome-terminal
   ................
   ................

Para encontrar el nombre del proceso utilizado por pid 2480, puede usar

# cat /proc/2480/cmdline 

 gnome-terminal

37



Tenga cuidado: OP menciona UNIX. No todos los UNIX implementan el Plan 9 como un archivo específico del proceso. Su respuesta generalmente solo se aplica a Linux. - slhck
Si bien es cierto, etiquetaron la pregunta "linux". Cualquiera que esté usando un sistema operativo UNIX no basado en Linux estará bastante acostumbrado a tener que modificar las respuestas para adaptarse a sus necesidades. - Andrew White


Para obtener la ruta del programa utilizando un cierto pid, puede usar:

ps ax|egrep "^ [PID]"

alternativamente puedes usar:

ps -a [PID]

enter image description here


12



ps -a enumera todos los procesos que están asociados con el terminal, no toma ninguna entrada. - Michael Lee
@MichaelLee, supongo que depende del ps versión, en procps version 3.2.7 funciona bien. - Pedro Lobito


# ls -la /proc/ID_GOES_HERE/exe

Ejemplo:

# ls -la /proc/1374/exe
lrwxrwxrwx 1 chmm chmm 0 Mai  5 20:46 /proc/1374/exe -> /usr/bin/telegram-desktop

7



Este es perfecto. - jayarjo
Probablemente mejor: readlink /proc/1337/exe. readlink - imprime enlaces simbólicos resueltos o nombres de archivos canónicos. - Pablo Bianchi


Puedes usar pmap. Estoy buscando el PID 6649. Y estoy cortando los detalles del proceso extra.

$ pmap 6649 | head -1
6649:   /usr/lib64/firefox/firefox

5





También puedes usar awk en combinación con ps

ps aux | awk '$2 == PID number for a process  { print $0 }'

ejemplo:

root@cprogrammer:~# ps aux | awk '$2 == 1 { print $0 }'
root         1  0.0  0.2  24476  2436 ?        Ss   15:38   0:01 /sbin/init    

para imprimir HEAD LINE que puede usar

 ps --headers aux |head -n 1 && ps aux | awk '$2 == 1 { print $0 }'

                 (or) 

 ps --headers aux |head -n 1; ps aux | awk '$2 == 1 { print $0 }'


root@cprogrammer:~# ps --headers aux |head -n 1 && ps aux | awk '$2 == 1 { print $0 }'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.2  24476  2436 ?        Ss   15:38   0:01 /sbin/init

3



Esto es inestable, ya que también seleccionaría procesos que incluyan el número en cualquier lugar de su comando. Tratar ps ax | grep 1 y ver si realmente devuelve el initproceso, por ejemplo. (En mi caso, devuelve 119 líneas, no es deseable). - slhck
@slhck Modificó la respuesta ... gracias por la información .. ps -p 1 -o comm = es la mejor opción para esta pregunta. - Gangadhar
No necesitamos dos ejecuciones para retener los encabezados, en su lugar usamos ps aux | awk 'NR==1 || $2==PID' - y no es necesario decir {print $0} porque es el predeterminado Pero como has comentado, -p es mejor de todos modos. - dave_thompson_085


Similar a Respuesta de slhck, pero confiando en las operaciones de archivos en lugar de las invocaciones de comandos:

MYPID=1
cat "/proc/$MYPID/comm"

2



[Ubuntu 14.04.4 LTS] cat /proc/1/comm => init, no / sbin / init. Su respuesta tiene la versión más larga incluida. Pero +1 de todos modos. - OmarOthman


Sorprendentemente, nadie ha mencionado la opción -f (comando completo) para ps. Me gusta usarlo con -e (todo) y canalizar los resultados a grep para poder restringir mi búsqueda.

ps -ef | grep <PID>

Esto también es muy útil para ver los comandos completos que alguien está ejecutando que están tomando muchos recursos en su sistema. Esto le mostrará las opciones y argumentos pasados ​​al comando.


2



No funciona en BSD (tal vez incluyendo MacOSX? No estoy seguro). Incluso donde -e -f están disponibles, grep puede producir muchas coincidencias falsas, p. grep 33 incluye pid = 933 o 339, ppid = 33 o 933 o 339, timeused de 33 segundos o 33 minutos, o nombre del programa o argumento que contiene 33, incluido el grep sí mismo. Todos (AFAIK) ps tener -p, por lo que sólo ps -fp 33. - dave_thompson_085


Encuentro el método más fácil de usar con el siguiente comando:

ps -awxs | grep pid

0



Además de ser altamente ineficiente en comparación con ps -p${pid}, esto recogerá muchos falsos positivos, incluido el grep sí mismo. - Toby Speight