Localizando o ID de um processo e matando-o

16

Sempre que preciso interromper um processo em segundo plano, ps -e | grep <process_name>

Que imprime algo parecido com isto 1766 ? 00:00:13 conky, então eu uso o ID do processo para killisso assim kill 1766.

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

Gautam
fonte
11
Recebi a resposta que desejo, mas esperarei um pouco antes de aceitar, para que a comunidade possa se beneficiar das várias opções disponíveis.
Gautam
Por favor, sinta-se à vontade para tornar esta pergunta mais genérica, se possível, para que mais pessoas possam se beneficiar das respostas
Gautam

Respostas:

18

(TL, DR: pgrep, pkill)

Muitas variantes do unix vêm com o pgrepe seu acompanhante pkill: Solaris , Linux (parte dos utilitários de processo padrão , podem estar ausentes nos sistemas Linux embarcados), FreeBSD , OpenBSD , NetBSD , ... mas apenas no MacPorts no OS X , não no AIX e somente recentemente no HP-UX . O pgreputilitário mostra o ID do processo dos processos correspondidos por nome, usuário e alguns outros critérios. O argumento to pgrepé interpretado como uma 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ê ligar em pkillvez depgrep, o utilitário envia um sinal em vez de exibir os IDs do processo.

Outro utilitário semelhante é o pidof . No Linux , é fornecido pelo SysVinit ou BusyBox (então você o encontrará em um sistema Linux incorporado que não possui pgrep); também existem portas em outras variantes unix. O pidofutilitário tem menos opções, geralmente corresponde apenas a nomes de arquivos executáveis ​​inteiros. Seu utilitário complementar killallenvia um sinal para os programas correspondentes¹.

That Cuidado killallcom um significado diferente no Solaris e possivelmente em outras variantes do unix; não digite killallcomo raiz no Solaris.

Gilles 'SO- parar de ser mau'
fonte
Nossa resposta é muito detalhada, muito mais profunda, Obrigado. Edite a pergunta para corresponder à resposta, se possível.
Gautam
@ GautamK Não acho que a questão precise se expandir. Se o fizer, sinta-se à vontade para editá-lo.
Gilles 'SO- stop be evil'
Das respostas com maior número de votos Sua resposta fornece mais detalhes, por isso estou aceitando isso #
Gautam
8
  • killall ProcessName (existe uma desvantagem com este comando, pois você nem sempre 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 para formar o histórico da sua festança, ou melhor, crie um alias para ela.
Hanan N.
fonte
O segundo pidofparece um pouco mais fácil, mas ainda são necessários dois passos
Gautam
Posso procurar / criar um comando de uma linha que faça isso em uma etapa (com um nome de processo aproximado), mas que exigiria que você digite uma linha longa (mais difícil que as duas etapas acima), ou digite-a uma vez e reutilizá-lo da história.
Hanan N.
@ GautamK eu atualizei a resposta com a opção de comando único.
Hanan N.
6

Enquanto Hanan tem algumas boas sugestões, vou adicionar 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 preciso que precisará matar.

O PS Hanan's pidofpode ser alimentado killdiretamente com backticks:

kill `pidof processname`
Kevin
fonte
pkillera exatamente o que eu procurava, na maioria das vezes sei o nome do processo, principalmente o seu conkyou firefoxou chromeou algo parecido. Graças
Gautam
1

Que tal agora -

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

Atualizar:

Desculpe, obviamente, isso não atende ao requisito de menos digitação, portanto, uma boa maneira de fazer isso seria adicionar um functionao seu .bashrc, .profileou qualquer que seja o script de inicialização. A função pode ser algo como isto -

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

Depois de adicionado, você pode simplesmente passar o nome do seu processo:

[jaypal:~] sleep 100&
[1] 77212
[jaypal:~] killp sleep
[1]+  Terminated: 15          sleep 100
jaypal singh
fonte