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