Como encontrar o ID do processo (PID) de um programa de terminal em execução?


Respostas:


128

Abra outro terminal e execute ps ax | grep fooonde foo é o nome do programa que não responde. Isso deve retornar uma linha de saída que se parece com isso:

$ ps ax | grep firefox
2222 ?        S      0:00 /bin/sh /usr/lib/firefox-3.6.9/firefox
2231 ?        Sl   514:36 /usr/lib/firefox-3.6.9/firefox-bin
30290 pts/2    S+     0:00 grep --color=auto firefox

O primeiro campo de cada linha de saída é um número que representa o ID do processo do programa correspondente grep(você pode ignorar com segurança o último, que se representa grep.

Para interromper o processo incorreto, faça: kill pidwhere pid é o ID do processo do programa. Talvez você precise julgar qual das correspondências precisa ser killeditada ou, em topvez disso, use-a . O uso killpor si só envia o SIGTERM, que você deve tentar primeiro, pois permite que o programa limpe adequadamente depois de si mesmo. Se SIGTERM falhar, tente SIGHUP, que é a medicina stonger: kill -HUP pid. Se tudo mais falhar, envie SIGKILL. Porém, você deve fazê-lo apenas como último recurso, porque o SIGKILL faz com que o kernel finalize o processo imediatamente, sem possibilidade de limpeza. Às vezes, isso pode resultar em corrupção de dados ou outros problemas. Então, novamente, envie apenas SIGKILL como último recurso. Para fazer isso, faça kill -KILL pidou kill -9 pid.

Se você está executando uma interface gráfica, é claro, não precisa se enganar com essas coisas malucas da linha de comando para fazer o trabalho. Basta abrir o "System Monitor", navegar até a guia Processos, escolher o processo que deseja interromper (Hm, poderia ser aquele que usa 90% da CPU?) E clicar com o botão direito do mouse. Como o processo já está parado, (esse é o problema, certo?), Escolha Finalizar processo ou Finalizar processo no menu resultante.

Crédito para koanhead


5
As pessoas nunca devem usar SIGKILL (kill -9), a menos que todos os outros métodos falhem. Apenas a listagem kill -9é um mau conselho. Eu editei a resposta para corrigi-la.
27512 Scott Severance

Como posso encontrar o pid de uma função personalizada. Eu tenho uma função que contém um loop com um pingcomando e sleep. De acordo com unix.stackexchange.com/a/275826/72988 , não é possível no Ubuntu sem multiplexer.
Timo

49

Eu não acho que haja necessidade de comandos tão longos quando você pode executar os mesmos comandos com pgrep, pkill, pidof etc ...

  • Para obter o pid de um programa em execução

pgrep:

   pgrep [options] pattern

DESCRIÇÃO: O pgrep examina os processos em execução no momento e lista os IDs do processo que correspondem aos critérios de seleção para o stdout. Todos os critérios devem corresponder. Por exemplo,

  • Para localizar o processo chamado sshd, de propriedade do root.

    $ pgrep -u root sshd
    
  • Listar os processos pertencentes ao root OU daemon.

    $ pgrep -u root,daemon
    

pidof:

DESCRIÇÃO :

Pidof localiza os IDs de processo (pids) dos programas nomeados. Ele imprime esses IDs na saída padrão.

sintaxe: pidof program_name

  • Para matar um programa por pid, use o exemplo pkill:

    pkill pid    
    pkill -f process_name    
    pkill -o process_name    
    pkill -n process_name    
    pkill -l process_name
    

    -fflag: Pesquisa o flag process_name (consulte man pkill)
    -o: selecione apenas o processo mais antigo correspondente.
    -nflag: selecione apenas o mais novo dos processos correspondentes.
    -lflag: Liste o nome do processo e o ID do processo.


1
Esta é a melhor resposta
BlackDivine 12/01

21

A maneira mais fácil de saber o pid de um programa em execução é usando:

pidof <application name>

Por exemplo, se você iniciou o vim e deseja conhecer seu pid:

pidof vim

Lembre-se de que você precisará fornecer o nome exato do programa que foi iniciado.

Por exemplo, se você estiver executando o vi e execute pidof vim, não obterá resultados corretos.

Consulte a pidofpágina do manual para mais informações.


Isso não está instalado por padrão. Pode estar no pacote sysvinit-utils.
Flickerfly

Eu tenho MariaDB. pidof mysqldretorna um PID. No entanto, se eu digitar pidof Mariadbnada será retornado. É o mesmo PID para o MariaDB e o MySQL?
305 Pathros

18

Eu achei bom usar uma pesquisa sem distinção entre maiúsculas e minúsculas adicionando o "-i" e usando "aux" em vez de "ax" para obter uma saída mais descritiva:

ps aux | grep -i firefox

Se você gostaria de matar todos os processos, você pode usar:

ps aux | grep -i firefox | awk {'print $2'} | xargs kill -9

Isso é uma matança forçada. Solte o "-9" se você quiser uma morte suave.


5
Isso também mata o ps aux | grep -i firefox...processo, porque contém o texto firefoxem seu comando!
Eric

1
@ Eric que você poderia usar grep -i firefo[x]para corresponder apenas ao firefox
AD

@ john-foley não aconselham a usar -9com kill, consulte aqui para explicações
AD

3

Se você quiser apenas o pid (útil para scripts de autokill, etc ...)

pgrep -f desired_program_name

1

Para aqueles que executam o Ubuntu 16.04 LTS, você deve usar ps axe não apenasps na linha de comando, caso contrário, você obterá os processos gerados a partir da instância do terminal em que você está. (Geralmente apenas 'bash' [o shell em que você está] ] e 'ps' [o que você acabou de executar])


Eu gosto ps -e(mostra tudo) e ps -ejH(mostra uma árvore de processo).
Andrew

1
@ Andrew agradável, isso é realmente muito doce - obrigado pela dica
cygnus_x1 01/10

0

Você também pode abrir outro terminal (ou alternar para outro tty) e executar top, que é basicamente uma versão em texto do System Monitor. A primeira coluna lista o PID de cada processo em execução, que você pode eliminar pressionando K, inserindo o PID e, em seguida, inserindo um sinal numérico para enviar.


0

Você poderia fazer:

ps ax | grep firefox | cut -f2 -d" " - | xargs kill -9

os dois primeiros pipes obtêm informações do processo, depois tentamos obter a coluna PID usando o corte da velha escola e depois damos o PID resultante para matar.


kill -9é a maior arma que você precisa para matar um processo. Você deve tentar um sinal mais gentil no início antes de recorrer à SIGKILL para dar ao processo a chance de limpar seus recursos.
Byte Commander

Isso é verdade, @ByteCommander. Eu queria transformá-lo em uma linha que fará o trabalho.
Arian Soltani

0
top

ou

screen -list|ls

listar todos os pid com o processo correspondente

kill -[pid]
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.