Em nossa aplicação, iniciamos alguns processos em segundo plano. O pid desses processos é salvo em um arquivo.
Os valores pids são reutilizados quando o máximo é atingido ou quando o sistema é reinicializado.
Como posso verificar com segurança se o processo com pid X ainda é o mesmo processo para o qual X foi armazenado.
Eu li https://serverfault.com/questions/366474/whats-a-proper-way-of-checking-if-a-pid-is-running ehttps://stackoverflow.com/questions/3043978/how-to-check-if-a-process-id-pid-exists mas essas soluções nunca verificam se o processo que possui pid X ainda é o mesmo processo para o qual o pid foi armazenado.
Preciso que essas informações sejam confiáveis
- verifique se o processo ainda está em execução
- mate o processo sem correr o risco de matar um processo diferente que agora tem pid X
relacionadohttps://serverfault.com/questions/279178/what-is-the-range-of-a-pid-on-linux-and-solaris
Vou postar minha solução atual. Gostaria de saber se é uma abordagem sensata e se existem maneiras melhores de fazer isso.
Responder1
Eu criei a seguinte solução para isso
Meu script inicial contém
nohup $commandline >> $TEMP/logfile 2>&1 &
MYPID=$!
echo $MYPID > pidfile
cat /proc/$MYPID/cmdline >> pidfile
Meu script stop lê o pidfile e verifica se o cmdline corresponde ao salvo originalmente
[ -f pidfile ] || { echo no pidfile; exit 1; }
read pid < pidfile
psatstart=$(tail -1 pidfile)
psnow=$(</proc/$pid/cmdline)
if [[ "$psnow" == "$psatstart" ]]
then
echo kill $pid
kill $pid || { echo kill $pid failed; exit 2; }
while ps -p $pid
do
sleep 1
done
else
echo pid $pid not the same, assume already ended
echo S $psatstart
echo N $psnow
fi
rm pidfile