Como matar apenas se o processo estiver em execução?

14

Atualmente eu uso uma linha como esta no meu arquivo de script sh:

kill `ps aux | grep -F 'myServer' | grep -v -F 'grep' | awk '{ print $2 }'` 

Mas gostaria de saber como chamá-lo apenas se o processo ( myServeraqui) estiver em execução?

myWallJSON
fonte
é impossível chamar killsomente quando o processo está em execução, porque existe uma condição de corrida entre o teste e a invocação de kill(é possível que o processo tenha sido interrompido por outro motivo nesse curto espaço de tempo). Você deve usar pkillou killallfazer exatamente o mesmo que você tenta fazer, mas com menos para digitar (e provavelmente algumas outras vantagens também).
janc

Respostas:

20

Eu costumo usar pgrep e pkill

if pgrep myServer; then pkill myServer; fi
boutch55555
fonte
7
Por que não pkill myServerou killall -q myServer? Não há desvantagem em tentar matar processos inexistentes.
precisa
12
Ele não sairá de 0 se não houver processo a ser eliminado, portanto poderá interromper os scripts.
boutch55555
6
Acrescente || trueentão.
David Foerster
É verdade, mas você não terá a flexibilidade de adicionar outro item para informar que o processo já estava morto.
boutch55555
Que tal if ! killall -q myServer; then echo ERROR; fi?
David Foerster
9

Você pode matar processos pelo nome usando pkillou killall, verifique suas páginas de manual.

enzotib
fonte
Sim, ao contrário kill, isso mata apenas se o processo estiver em execução. Por exemplopkill -u myuser -f myprocess\.[0-9]+
Chase T.
6

Uma abordagem um pouco diferente seria algo como isto:

killall PROCESS || echo "Process was not running."

Isso evitará o 1código de erro retornado do killallcomando, se o processo não existir. A echopeça só entrará em ação se killallretornar 1, enquanto ela retornará 0(sucesso).

codepleb
fonte
5
Usando killall -qé melhor
Anwar
1
Aviso, killall -qnão é suportado em todos os tipos de unix, o macOS Catalina ainda não o possui.
tresf
0

tente usar:

sudo kill `pidof process_name`

onde process_name é o nome do processo que você deseja matar. O que é ótimo nisso é que o pidof listará os pids de todos os processos correspondentes ao nome fornecido. Como o kill aceita vários pid's, ele mata todos eles com um único capricho.

Avise-me se isso ajudar.

amandion
fonte
E se a lista estiver vazia? (o meu ponto principal não era matar chamada em todos, se possível)
myWallJSON
1
Se a lista estiver vazia, kill retornará um código de erro 1 e não matará nada. Seria o equivalente a tentar chamar kill sem argumentos. Você pode adicionar uma instrução if que primeiro verifique se pidof retorna uma lista vazia. Se não retornar uma lista vazia, ligue kill `pidof process_name. Se retornar uma lista vazia, pule a chamada final.
amandion
0

Script pequeno que eu criei com P&D. Eu espero que você goste

#!/bin/bash

echo " Enter the process name:"
read $proc_name
if pgrep $proc_name
then
echo " $proc_name running "
pkill $proc_name
echo "$proc_name  got killed"
else
echo " $proc_name is not running/stopped "
fi

salve-o com um nome como script.sh e

chmod +x script.sh
./script.sh

Em seguida, dê o nome do seu processo.

Nota: Eu tentei muitas vezes com isso e está tudo bem.

rɑːdʒɑ
fonte
Posso saber o que há de errado com este script e -ve vote precisa de uma explicação, por favor.
513414
Nada de errado com este script ... +1
WinEunuuchs2Unix 13/11
0

Verifique se o processo existe com pidof. Se isso acontecer, mate-o:

(! pidof process_name) || sudo kill -9 $(pidof process_name)

O código de saída é sempre 0 depois de executar o comando acima.

Juuso Ohtonen
fonte
0

Use pkillcom a opção-f

pkill -f myServer

Option -fé o padrão que normalmente corresponde ao nome do processo.

Chase T.
fonte
-1

Eu usaria:

ps x --no-header -o pid,cmd | awk '!/awk/&&/myServer/{print $1}' | xargs -r kill

O xargs -rcomando diz para executar kill apenas se houver entrada. O ps --no-header -eo pid,cmdobtém a saída em um formato melhor para análise.

Arcege
fonte