Encontrando o ID de um processo e matando-o

16

Sempre que eu preciso matar um processo de background eu faço ps -e | grep <process_name>

Que imprime algo assim 1766 ? 00:00:13 conky , Então eu uso o ID do processo para kill assim como kill 1766 .

Existe alguma maneira de simplificar isso? Torná-lo mais rápido? reduzir a quantidade de digitação?

    
por Gautam 18.12.2011 / 00:32

4 respostas

18

(TL, DR: pgrep , pkill )

Muitas variantes do unix vêm com o pgrep e seu companheiro pkill : Solaris , Linux (parte dos utilitários de processo padrão , podem estar ausentes dos sistemas Linux embarcados), FreeBSD , OpenBSD , NetBSD , ... mas apenas do MacPorts no OS X , não AIX e apenas recentemente no HP-UX . O utilitário pgrep mostra o ID do processo dos processos correspondidos por nome, usuário e alguns outros critérios. O argumento para pgrep é interpretado como um regexp que deve corresponder a parte do nome do executável do processo (a menos que você passe uma opção para alterar isso). Se você chamar pkill em vez de pgrep , o utilitário enviará um sinal em vez de exibir os IDs do processo.

Outro utilitário similar é o pidof . Em Linux , é fornecido por SysVinit ou BusyBox (assim, você frequentemente o encontrará em um sistema Linux embarcado que não possui pgrep ); também há portas em outras variantes unix. O utilitário pidof tem menos opções, na maioria das vezes, apenas corresponde a nomes de arquivos executáveis inteiros. Seu utilitário associado killall envia um sinal para os programas correspondentes.

Tenha em atenção que killall tem um significado diferente no Solaris e possivelmente outras variantes unix; não digite killall como root no Solaris.

    
por 18.12.2011 / 01:13
8
  • killall ProcessName (há uma desvantagem com esse comando, pois nem sempre você sabe o nome do processo de um programa).
  • pidof ProccessName e kill the result form pidof
  • ps xu | grep <process name> | grep -v grep | awk '{ print $2 }' | xargs kill -9 Experimente esta linha e reutilize-a do histórico do seu bash, ou crie um alias para ela melhor.
por 18.12.2011 / 00:37
6

Enquanto Hanan tiver boas sugestões, adicionarei pgrep / pkill . Eles permitem um controle muito mais preciso sobre o processo que você encontra e expressões regulares, se você não souber o processo exato que precisará matar.

P.S. O pidof de Hanan pode ser enviado para kill diretamente com backticks:

kill 'pidof processname'
    
por 18.12.2011 / 01:05
1

Que tal isso -

ps -e | awk '$4~/<process name>/{print $1}' | xargs kill

Exemplo:

[jaypal:~/Temp] sleep 100&
[1] 74863
[jaypal:~/Temp] ps -e | awk '$4~/sleep/{print $1}' | xargs kill
[1]+  Terminated: 15          sleep 100

Atualização:

Desculpe, isso obviamente não atende ao requisito de menos digitação, portanto, uma boa maneira de fazer isso seria adicionar um function ao seu .bashrc , .profile ou qualquer outro script de inicialização. A função pode ser algo assim -

killp() {
awk -v pname="$1" '($4==pname){print $1}' <(ps -e) | xargs kill
}

Uma vez adicionado, você pode simplesmente passar o nome do seu processo:

[jaypal:~] sleep 100&
[1] 77212
[jaypal:~] killp sleep
[1]+  Terminated: 15          sleep 100
    
por 19.12.2011 / 03:36