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).


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


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.


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 ...


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`

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]

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

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


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.


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


6

Para matar com grep:

kill -9 `pgrep myprocess`

5

mais correto seria:

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

11
Por que você exportusa uma variável que você vai usar apenas uma vez no mesmo processo?
Tripleee


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

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.


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) .


Como reativar a ação enable -n kill?
Brethlosze

11
@hyprfrcbenable kill
The Vee



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.*
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.