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


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

O que eu tenho que fazer?


205


origem


Você pode usar ps ou ls -l /proc/$PID/exe - Eddy_Em
@Eddy_Em que lhe dará o arquivo executável, que nem sempre é o nome do processo. Além disso, isso não é portátil ... - derobert
ps -fp PID mostrará o comando completo - Temak


Respostas:


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

ps -p 1337 -o comm=

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

Veja também: ps - Especificações do Open Group Base Issue 6


222



comm parece truncar o comando para 15 caracteres. Usando command em vez disso, corrige. - Nemo
[Ubuntu 14.04.4 LTS] $ ps -p 1 -o comm=  nisso $ 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 em relação ao seu caminho completo. - OmarOthman
Na realidade, comm dá o nome do binário e command retorna o argumento 0 - robbie0630


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

/proc/pid/cmdline

fazendo

cat /proc/pid/cmdline

Aqui pid é o pid para o qual você quer 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

37



Tenha cuidado: O OP menciona o UNIX. Nem todos os UNIXs implementam o arquivo específico do processo do Plan 9. Sua resposta geralmente se aplica apenas ao Linux. - slhck
Enquanto isso é verdade, eles marcaram a questão "linux". Qualquer um que esteja usando um sistema operacional UNIX não baseado em Linux estará bastante acostumado a ter que modificar as respostas para atender às suas necessidades. - Andrew White


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

ps ax|egrep "^ [PID]"

Como alternativa, você pode usar:

ps -a [PID]

enter image description here


12



ps -a listar todos os processos associados ao terminal, ele não recebe nenhuma entrada. - Michael Lee
@MichaelLee eu acho que depenends no ps versão, em procps version 3.2.7 funciona bem. - Pedro Lobito


# 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

7



Este é perfeito. - jayarjo
Provavelmente melhor: readlink /proc/1337/exe. readlink - imprime links simbólicos resolvidos ou nomes de arquivos canônicos. - Pablo Bianchi


Você pode usar o pmap. Eu estou procurando por PID 6649. E cortando os detalhes do processo extra.

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

5





Você também pode usar o awk em combinação com 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

3



Isso é instável, pois também seleciona processos que incluem o número em qualquer lugar de seu comando. Experimentar ps ax | grep 1 e ver se ele realmente retorna o initprocesso, por exemplo. (No meu caso, ele retorna 119 linhas - não é desejável). - slhck
@slhck Modificou a resposta ... obrigado pela informação .. ps -p 1 -o comm = é a melhor opção para esta questão. - Gangadhar
Não precisamos de duas execuções para manter cabeçalhos, em vez disso, usamos ps aux | awk 'NR==1 || $2==PID' - e não precisa dizer {print $0} porque é o padrão. Mas como você comentou, -p é melhor de qualquer maneira. - dave_thompson_085


Semelhante a Resposta de slhck, mas confiando em operações de arquivo em vez de invocações de comando:

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

2



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


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

ps -ef | grep <PID>

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


2



Não funciona no BSD (talvez incluindo MacOSX? Não tenho certeza). Mesmo quando -e -f Estão disponíveis, grep pode produzir muitas correspondências falsas, e. grep 33 inclui pid = 933 ou 339, ppid = 33 ou 933 ou 339, tempo gasto de 33 segundos ou 33 minutos, ou nome do programa ou argumento contendo 33 - incluindo o grep em si. Todos (AFAIK) ps tem -p, então apenas ps -fp 33. - dave_thompson_085


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

ps -awxs | grep pid

0



Além de ser altamente ineficiente em comparação com ps -p${pid}, isso vai pegar muitos falsos positivos - incluindo o grep em si. - Toby Speight