Se eu souber o número PID de um processo, como posso obter seu nome?


263

Se eu tiver o número PID de um processo (em uma máquina UNIX), como posso descobrir o nome do processo associado?

O que eu tenho que fazer?


9
Você pode usar psouls -l /proc/$PID/exe
Eddy_Em 17/08/13

1
@ Eddy_Em que fornecerá o arquivo executável, que nem sempre é o nome do processo. Além disso, isso não é portátil ...
derobert

9
ps -fp PIDmostrará o comando completo
Temak 4/11/16

Respostas:


284

Em todos os sistemas compatíveis com POSIX e com Linux, você pode usar ps:

ps -p 1337 -o comm=

Aqui, o processo é selecionado pelo seu PID com -p. A -oopção especifica o formato de saída, commsignificando o nome do comando.

Veja também: ps- O Open Group Base Specifications Issue 6


28
comm parece truncar o comando para 15 caracteres. Usar o commandcorrige.
Nemo

1
[Ubuntu 14.04.4 LTS] $ ps -p 1 -o comm= init $ ps -p 1 -o command= / sbin / init; o que significa que não tem cerca de 15 caracteres, talvez apenas o nome do binário x seu caminho completo.
OmarOthman

3
Na verdade, commdá do binário nome e commandretorna argumento 0
Robbie

45

Você pode encontrar o nome do processo ou o comando usado pelo ID do processo ou pid em

/proc/pid/cmdline

fazendo

cat /proc/pid/cmdline

Aqui pid é o pid para o qual você deseja encontrar o nome
Por exemplo:

 # ps aux

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

Para encontrar o nome do processo usado pelo pid 2480, você pode usar

# cat /proc/2480/cmdline 

 gnome-terminal

14
Cuidado: o OP menciona o UNIX. Nem todos os UNIXs implementam o Plano 9 como um arquivo específico do processo. Sua resposta geralmente se aplica apenas ao Linux.
slhck

3
Embora isso seja verdade, eles marcaram a pergunta "linux". Qualquer pessoa que está usando um sistema operacional UNIX com base não-Linux será bastante acostumado a ter de modificar respostas para atender suas necessidades
Andrew White

14

Para obter o caminho do programa usando um certo pid, você pode usar:

ps ax|egrep "^ [PID]"

Como alternativa, você pode usar:

ps -a [PID]

insira a descrição da imagem aqui


1
ps -alistar todos os processos associados ao terminal, ele não recebe nenhuma entrada.
Michael Lee

@ MichaelLee Eu acho que depende da psversão, procps version 3.2.7funciona bem.
Pedro Lobito

8
# ls -la /proc/ID_GOES_HERE/exe

Exemplo:

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

Este é perfeito.
Jayarjo

1
Provavelmente melhor: readlink /proc/1337/exe. readlink - imprima links simbólicos resolvidos ou nomes de arquivos canônicos.
Pablo A

8

Você pode usar o pmap. Estou procurando pelo PID 6649. E cortando os detalhes extras do processo.

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

Esse comando me ajudou mais do que eu precisava, tenho a linha completa do processo iniciado. Dado um processo Java, com o pscomando tudo o que você verá é justo java, mas o restante dos parâmetros passados ​​será exibido totalmente pmap.
Daniel Andrei Mincă 31/08/18

3

Você também pode usar o awk em combinação com o ps

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

exemplo:

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 você pode 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
Isso é instável, pois também seleciona processos que incluem o número em qualquer lugar em seu comando. Tente ps ax | grep 1e veja se realmente retorna o initprocesso, por exemplo. (No meu caso, ele retorna 119 linhas-não é desejável.)
slhck

1
@slhck Modificou a resposta ... obrigado pela informação .. ps -p 1 -o comm = é a melhor opção para esta pergunta.
Gangadhar

Não precisamos de duas execuções para manter os cabeçalhos; em vez disso, use ps aux | awk 'NR==1 || $2==PID'- e não precisamos dizer {print $0}porque é o padrão. Mas como você comentou, -pé melhor de qualquer maneira.
Dave_thompson_085

3

Semelhante à resposta do slhck , mas contando com operações de arquivo em vez de invocações de comando:

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

[Ubuntu 14.04.4 LTS] cat /proc/1/comm=> init, não / sbin / init. Sua resposta inclui a versão mais longa. Mas +1 de qualquer maneira.
OmarOthman

2

Surpreendentemente, ninguém mencionou a opção -f (comando completo) para o ps. Eu gosto de usá-lo com -e (tudo) e canalizar os resultados para grep, para que eu possa restringir minha pesquisa.

ps -ef | grep <PID>

Isso também é muito útil para analisar os comandos completos que alguém está executando e que consome muitos recursos em seu sistema. Isso mostrará as opções e argumentos passados ​​para o comando.


3
Não funciona no BSD (talvez incluindo o MacOSX? Não tenho certeza). Mesmo quando -e -fdisponível, greppode produzir muitas correspondências falsas, por exemplo, grep 33inclui pid = 933 ou 339, ppid = 33 ou 933 ou 339, tempo usado de 33 segundos ou 33 minutos, ou nome do programa ou argumento contendo 33 - incluindo o greppróprio. Todos (AFAIK) pstêm -p, então apenas ps -fp 33.
Dave_thompson_085

0

Eu acho o método mais fácil de estar com o seguinte comando:

ps -awxs | grep pid

Além de ser altamente ineficiente em comparação com ps -p${pid}, isso captará muitos falsos positivos - incluindo o greppróprio.
Toby Speight

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.