Como posso matar um processo pelo nome em vez de PID?

349

Às vezes, quando tento iniciar o Firefox, ele diz "um processo do Firefox já está em execução". Então eu tenho que fazer isso:

jeremy@jeremy-desktop:~$ ps aux | grep firefox
jeremy    7451 25.0 27.4 170536 65680 ?        Sl   22:39   1:18 /usr/lib/firefox-3.0.1/firefox
jeremy    7578  0.0  0.3   3004   768 pts/0    S+   22:44   0:00 grep firefox
jeremy@jeremy-desktop:~$ kill 7451

O que eu gostaria é de um comando que faria tudo isso por mim. Seria necessário uma string de entrada e greppara ela (ou qualquer outra coisa) na lista de processos, e eliminaria todos os processos na saída:

jeremy@jeremy-desktop:~$ killbyname firefox

Tentei fazê-lo no PHP, mas exec('ps aux')parece mostrar apenas processos executados exec()no próprio script PHP (portanto, o único processo que ele mostra é ele próprio).

Jeremy Ruten
fonte
Quando recebo a janela que diz que o Firefox já está em execução, normalmente tenho que esperar um segundo e posso executar o Firefox novamente (é claro que nem sempre é o caso).
27414 noritoveri
11
Esta é a maneira mais segura, como JohnB diz nesta resposta: stackoverflow.com/questions/6381229/…
tecnoshopbq 8/14
Esta é uma pergunta antiga, mas você poderia alterar a resposta aceita? O que você marcou falha em muitos processos, como os executados pela JVM.
Luís de Sousa
Para qualquer referência a este tema, no comentário acima, Luis está referenciando a resposta abaixo que agencia o pkill -f "Process name"comando ...
Digger

Respostas:

505
pkill firefox

Mais informações: http://linux.about.com/library/cmd/blcmdl1_pkill.htm

shoosh
fonte
7
Usar o pgrep para descobrir o que você está matando antes de começar a matar processos é uma coisa boa. Especialmente ao usar -f.
Akrikos
Pkill não é muito amigável. você não pode dar nomes da mesma maneira que killall os leva.
Octopus
2
pkill -U <username>é bastante útil. Eu tenho um servidor Web Solaris , o daemon real do servidor Web, é configurado como um Serviço com seu próprio usuário. Portanto, especificar pelo usuário é uma maneira simples / fácil de acionar uma reinicialização.
Raystorm
6
Para forçar kill: pkill -9 firefox
Justas
Isso funciona metade das vezes na melhor das hipóteses. Você precisa pelo menos da -fbandeira para uma solução omnibus.
Luís de Sousa
112

Também é possível usar:

pkill -f "Process name"

Para mim, funcionou perfeitamente. Era o que eu estava procurando. O pkill não funciona com o nome sem a bandeira.

Quando -fdefinido, a linha de comando completa é usada para correspondência de padrões.

Vencedor
fonte
2
especialmente para executar algo com vinho, a -fopção é realmente necessária. por exemplopkill -f "EvilWindowsServer.exe"
CodeBrauer
Essa deve ser a resposta aceita. A primeira resposta falha com muitos tipos de programas, por exemplo, aqueles executando em uma JVM.
Luís de Sousa
11
Eu tive que adicionar a -fflag também para matar um processo em segundo plano executando um script Python.
Mason
no meu caso, eu precisava de 2 sinalizadores:pkill -f -9 PROCESSNAME
Slavik
seu trabalho em centos7.thank
sirmagid 15/02
64

Você pode matar processos pelo nome comkillall <name>

killall envia um sinal para todos os processos executando qualquer um dos comandos especificados. Se nenhum nome de sinal for especificado, o SIGTERM será enviado.

Os sinais podem ser especificados pelo nome (por exemplo, -HUP ou -SIGHUP ) ou pelo número (por exemplo, -1 ) ou pela opção -s .

Se o nome do comando não for uma expressão regular (opção -r ) e contiver uma barra (/), os processos que executam esse arquivo específico serão selecionados para eliminação, independentemente do nome.

Mas se você não ps auxvir o processo , provavelmente não terá o direito de matá-lo ...

Andre Bossard
fonte
6
Para forçar o encerramento de um programa que não está respondendo, envie KILL em vez de TERM:killall -s KILL firefox
Martin Hansen
45

Uma alternativa um pouco mais longa:

kill `pidof firefox`
Walter
fonte
25
pidof firefox | xargs kill -9
hbt 16/12/12
11
este funciona sob busybox para seus dispositivos embarcados :)
nwgat
25

A maneira mais fácil de fazer isso é verificar primeiro se você está obtendo os IDs de processo corretos com:

pgrep -f [part_of_a_command]

Se o resultado for o esperado. Ir com:

pkill -f [part_of_a_command]
Tahsin Turkoz
fonte
19

Estranho, mas eu não vi a solução assim:

kill -9 `pidof firefox`

também pode matar vários processos (vários pids) como:

kill -9 `pgrep firefox`

Eu prefiro, pidofpois tem saída de linha única:

> pgrep firefox
6316
6565
> pidof firefox
6565 6316
prosti
fonte
Quando executo isso, recebi o erro kill: invalid number 'pidof myprogram'. O que há de ruim aqui?
Brethlosze
isso acabou de salvar minha vida hoje ... Não quero escrever mais, mas estou feliz por ter encontrado aqui. obrigado cara.
26517 MilMike
11
Chegando atrasado, mas no caso de alguém se perguntar ... @Brethlosze você coloca ticks únicos, enquanto o comando requer reticências.
espectros
! Obrigado .. i vai ser (e estou a ser) ciente destas backticks :)
Brethlosze
13

Mate todos os processos com o snippetcaminho de inicialização. Você pode matar todos os aplicativos iniciados em algum diretório colocando / directory / como um trecho. Isso é bastante útil quando você inicia vários componentes para o mesmo aplicativo no mesmo diretório de aplicativos.

ps ax | grep <snippet> | grep -v grep | awk '{print $1}' | xargs kill

* Prefiro o pgrep, se disponível

Mike
fonte
11
Esta é uma combinação frequentemente vista de antipadrões. Use um regex que não corresponda a si mesmo (ou o nome do script que o contém) e evite um inútilgrep . ps ax | awk '/[s]nippet/ { print $1 }' | xargs kill
Tripleee
11
evitando grep inútil você não está evitando erros de digitação e capacidade de usar o comando em processos automatizados que parametrizar a <trecho>
Mike
Esta é realmente a melhor maneira de fazê-lo!
Abhinandan Dubey
Seria ótimo entender por que o @ tripleee [s]funciona em termos de não corresponder ao processo awk?
andig 02/11/19
Porque o regex [x]ycorresponde à string, xymas não vice-versa. Esta é uma FAQ comum. O link é para uma página de mais de 20 anos atrás, que explica isso com mais detalhes; e essa era uma pergunta recorrente já naquela época.
tripleee
11

No Mac, não consegui encontrar o pgrep e o pkill, nem o killall estava funcionando, então escrevi um script simples de um liner: -

export pid=`ps | grep process_name | awk 'NR==1{print $1}' | cut -d' ' -f1`;kill $pid

Se houver uma maneira mais fácil de fazer isso, compartilhe.

Dhiraj
fonte
11
Ri muito. Este é um comando insano para essa tarefa. Deixa pra lá. Você chamou isso de uma linha simples? : D Simple is killall
m3nda
@ erm3nda :-) Concordo. Olhando para trás, parece insano. Não me lembro por que o killall não estava funcionando no meu mac.
Dhiraj
Isso é muito útil quando você deseja matar um certo processo Java como "jboss". Nesse caso, killall não ajuda.
Jan M
9

Usando o #killallcomando:

#killall -9 <processname>
user2396265
fonte
6

Para matar com grep:

kill -9 `pgrep myprocess`
edW
fonte
5

mais correto seria:

export pid=`ps aux | grep process_name | awk 'NR==1{print $2}' | cut -d' ' -f1`;kill -9 $pid
Chadiso
fonte
11
Por que você exportusa uma variável que você vai usar apenas uma vez no mesmo processo?
Tripleee
4

Eu normalmente uso o killallcomando

Verifique este link para obter detalhes deste comando.

Bittercoder
fonte
3

Eu estava me perguntando a mesma pergunta, mas o problema com as respostas atuais é que elas não verificam com segurança os processos a serem mortos, então ... isso pode levar a erros terríveis:) ... especialmente se vários processos corresponderem ao padrão .

Como isenção de responsabilidade, não sou profissional e certamente há espaço para melhorias.

Então eu escrevi um pequeno script sh:

#!/bin/sh

killables=$(ps aux | grep $1 | grep -v mykill | grep -v grep)
if [ ! "${killables}" = "" ]
then
  echo "You are going to kill some process:"
  echo "${killables}"
else
  echo "No process with the pattern $1 found."
  return
fi
echo -n "Is it ok?(Y/N)"
read input
if [ "$input" = "Y" ]
then
  for pid in $(echo "${killables}" | awk '{print $2}')
  do
    echo killing $pid "..."
    kill $pid 
    echo $pid killed
  done
fi
Fab
fonte
2

Se você executa o GNOME, pode usar o monitor do sistema (Sistema-> Administração-> Monitor do Sistema) para interromper os processos como faria no Windows. O KDE terá algo semelhante.

Bernard
fonte
2

O killcomando padrão aceita nomes de comando como uma alternativa ao PID. Veja kill (1) . Um problema que ocorre com frequência é o de bashfornecer seus próprios dados, killque aceita números de trabalho, como kill %1, mas não nomes de comando. Isso dificulta o comando padrão. Se a funcionalidade anterior for mais útil para você do que a última, você poderá desativar a bashversão chamando

enable -n kill

Para mais informações, consulte kille enableentradas no bash (1) .

The Vee
fonte
Como reativar a ação enable -n kill?
Brethlosze
11
@hyprfrcbenable kill
The Vee
1

kill -9 $ (ps aux | grep -e nome do meu processo | awk '{print $ 2}')

Nived Thanima
fonte
0
ps aux | grep processname | cut -d' ' -f7 | xargs kill -9 $
porta de consulta
fonte
0

awk oneliner, que analisa o cabeçalho da pssaída, para que você não precise se preocupar com os números das colunas (mas com os nomes das colunas). Regex de suporte. Por exemplo, para matar todos os processos, cujo nome do executável (sem caminho) contém a palavra "firefox", tente

ps -fe | awk 'NR==1{for (i=1; i<=NF; i++) {if ($i=="COMMAND") Ncmd=i; else if ($i=="PID") Npid=i} if (!Ncmd || !Npid) {print "wrong or no header" > "/dev/stderr"; exit} }$Ncmd~"/"name"$"{print "killing "$Ncmd" with PID " $Npid; system("kill "$Npid)}' name=.*firefox.*
Andrey Bochkov
fonte