Presumivelmente, sua intenção com essas linhas é evitar a correspondência do comando grep
na saída de ps
:
PID='ps faux | grep libt | awk 'NR==2{print $2}''
STATUS='ps faux | grep libt | awk 'NR==2{print $1}''
Você não pode garantir que a segunda linha será a desejada. Você deve eliminar grep
usando um truque comum:
ps faux | grep [l]ibt
colocando um caractere entre colchetes, grep
procura por "libt" mas não o literal "[l] ibt" porque ele interpreta caracteres entre colchetes como uma lista.
Você deve usar $()
para substituição de comandos em vez de backticks. Eles são mais legíveis e mais fáceis de fazer ninhos.
Você também pode obter o nome de usuário e PID usando uma chamada para ps
reduzindo as chances de uma condição de corrida, mas você realmente não precisa do nome de usuário, já que você já sabe disso. Você só precisa saber se o processo está sendo executado ou não.
No entanto, ainda há oportunidades para falsos positivos. Se puder, você deve usar pgrep
e pkill
.
#!/bin/sh
PID=$(pgrep -U ec2-user libt 2>/dev/null)
if [ $? = 0 ]
then
kill $PID
echo "libt was killed"
else
echo "libt already killed"
fi
sleep 5
/home/ec2-user/libt/libt
Por favor, veja Gerenciamento de Processos para mais informações.