Como verificar se o processo com pid X é o que você espera

Como verificar se o processo com pid X é o que você espera

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

informação relacionada