Ao executar ./killProcess.sh somename
, um processo semelhante a
/bin/bash ./killProcess.sh somename
existe e a ps | grep | grep | awk
-line também encontra essa porque tem o texto somename
nela. Eu não sei exatamente porque você tem dois PIDs adicionais (e não apenas um), mas eu acho que é alguma coisa entre pais / filhos entre bash
e killProcess.sh
. Em uma linha, o PID aparece como PID e, no outro, como PPID.
Você pode evitar esses PIDs usando o nome do script. Ele é armazenado em $0
, então
PID=$(ps -ef | grep $PROCESSNAME | grep -v grep | grep -v $0 | awk '{print $2}');
ou (com menos chamadas de programa):
PID=$(ps -ef | grep $PROCESSNAME | grep -v -e grep -e $0 | awk '{print $2}');
Outra maneira (mais segura) seria remover o PID do script. Está armazenado em $$
:
PID=$(ps -ef | grep $PROCESSNAME | grep -v -e grep -e $$ | awk '{print $2}');
Ou faça tudo em awk
:
PID=$(ps -ef | awk "/$PROCESSNAME/ && !/awk/ && !/$$/ {print \}");
Precisamos escapar do \
aqui, por isso não é interpretado pelo shell, mas sim por awk
. Esse comando significa:
Se a linha contiver $PROCESSNAME
e não contiver awk
e não contiver nosso próprio PID, imprima a segunda coluna.
A vantagem é (em teoria) que isso é mais rápido porque apenas um comando adicional ( awk
) é necessário, em oposição a 3 greps e awk.
Mas:
Todos esses greps e awks não são perfeitos e você sempre encontrará uma situação que não temos aqui (como correspondências parciais, etc.). Por isso recomendo usar uma das ferramentas já escritas:
-
killall somename
# para visualizar, execute primeirokillall -v -s 0 somename
-
pgrep somename
# apenas liste os PIDs -
pkill somename
# semelhante akillall