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


263

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?


99
Puede usar psols -l /proc/$PID/exe
Eddy_Em

1
@Eddy_Em que le dará el archivo ejecutable, que no siempre es el nombre del proceso. Además, eso no es portátil ...
derobert

99
ps -fp PIDmostrará el comando completo
Temak

Respuestas:


284

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

ps -p 1337 -o comm=

Aquí, el proceso se selecciona por su PID con -p. La -oopción especifica el formato de salida, es commdecir , el nombre del comando.

Consulte también: ps- Open Group Base Especificaciones, número 6


28
comm parece truncar el comando a 15 caracteres. Usar en su commandlugar lo arregla.
Nemo

1
[Ubuntu 14.04.4 LTS] $ ps -p 1 -o comm= init $ ps -p 1 -o command= / sbin / init; lo que significa que no se trata de 15 caracteres, tal vez solo el nombre del binario frente a su ruta completa.
OmarOthman

3
En realidad, commda el nombre del binario y commanddevuelve el argumento 0
robbie

45

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

/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 de proceso utilizado por pid 2480, puede usar

# cat /proc/2480/cmdline 

 gnome-terminal

14
Tenga cuidado: el 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

3
Si bien eso es cierto, etiquetaron la pregunta "linux". Cualquier persona que está utilizando un sistema operativo UNIX basado en Linux no será muy acostumbrado a tener que modificar respuestas para adaptarse a sus necesidades
Andrew White

14

Para obtener la ruta del programa usando un determinado pid puede usar:

ps ax|egrep "^ [PID]"

alternativamente puedes usar:

ps -a [PID]

ingrese la descripción de la imagen aquí


1
ps -aEnumere todos los procesos que están asociados con el terminal, no toma ninguna entrada.
Michael Lee

@MichaelLee Supongo que depende de la psversión, procps version 3.2.7funciona bien.
Pedro Lobito

8
# 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

Este es perfecto
jayarjo

1
Probablemente mejor: readlink /proc/1337/exe. readlink: imprime enlaces simbólicos resueltos o nombres de archivos canónicos.
Pablo A

8

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

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

Este comando me ayudó más de lo que necesitaba, tengo la línea completa del proceso que comenzó. Dado un proceso Java, con el pscomando todo lo que verá es justo java, pero el resto de los parámetros pasados ​​se mostrarán completamente con pmap.
Daniel Andrei Mincă

3

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 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

2
Esto es inestable ya que también seleccionaría procesos que incluyen el número en cualquier lugar de su comando. Pruebe ps ax | grep 1y vea si realmente devuelve el initproceso, por ejemplo. (En mi caso, devuelve 119 líneas, no deseable.)
slhck

1
@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 encabezados, en su lugar, use ps aux | awk 'NR==1 || $2==PID', y no necesitamos decirlo {print $0}porque es el valor predeterminado. Pero como comentaste, -pes mejor de todos modos.
dave_thompson_085

3

Similar a la respuesta de slhck , pero confiando en operaciones de archivo en lugar de invocaciones de comando:

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

[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

2

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 limitar mi búsqueda.

ps -ef | grep <PID>

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


3
No funciona en BSD (¿quizás incluye MacOSX? No estoy seguro). Incluso donde -e -festán disponibles, greppuede producir muchas coincidencias falsas, por ejemplo, grep 33incluye pid = 933 o 339, ppid = 33 o 933 o 339, tiempo de uso de 33 segundos o 33 minutos, o nombre de programa o argumento que contiene 33, incluido el greppropio. Todos (AFAIK) pstienen -p, así que solo ps -fp 33.
dave_thompson_085

0

Encuentro el método más fácil para estar con el siguiente comando:

ps -awxs | grep pid

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.