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