Cómo comprobar si el proceso con pid X es el que esperas

Cómo comprobar si el proceso con pid X es el que esperas

En nuestra aplicación, iniciamos algunos procesos en segundo plano. El pid de estos procesos se guarda en un archivo.

Los valores de pids se reutilizan cuando se alcanza el máximo o cuando se reinicia el sistema.

¿Cómo puedo verificar de manera confiable que el proceso con pid X sigue siendo el mismo proceso para el cual se almacenó X?

he leído https://serverfault.com/questions/366474/whats-a-proper-way-of-checking-if-a-pid-is-running yhttps://stackoverflow.com/questions/3043978/how-to-check-if-a-process-id-pid-exists pero estas soluciones nunca verifican si el proceso que tiene el pid X sigue siendo el mismo proceso para el que se almacenó el pid.

Necesito esta información para ser confiable

  • comprobar que el proceso aún se está ejecutando
  • mata el proceso sin correr el riesgo de matar un proceso diferente que ahora tiene pid X

relacionadohttps://serverfault.com/questions/279178/cuál-es-el-rango-de-un-pid-en-linux-y-solaris

Publicaré mi solución actual. Me gustaría saber si es un enfoque sensato y si hay mejores formas de hacerlo.

Respuesta1

Creé la siguiente solución para esto

Mi script de inicio contiene

nohup $commandline >> $TEMP/logfile 2>&1 &
MYPID=$!
echo $MYPID > pidfile
cat /proc/$MYPID/cmdline >> pidfile

Mi script de detención lee el archivo pid y verifica si la línea cmd corresponde a la que se guardó 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

información relacionada