Solución 1:
en términos simples, no :un proceso (por ejemplo, un demonio) puede fallar y no tener tiempo para borrar su archivo .pid.
Una técnica para estar más seguro del estado de un programa:usar un canal de comunicación explícito como un socket. Escriba el puerto del socket en un archivo y tenga el supervisor
proceso búsquelo.
También puede usar los servicios de DBus en Linux:registre un nombre específico y haga que su proceso de supervisor (como quiera que lo llame) verifique ese nombre.
Existen numerosas técnicas.
Una cosa para recordar:no es responsabilidad del sistema operativo administrar los archivos PID.
Solución 2:
Jldupont tiene razón al afirmar que los archivos .pid no son confiables para determinar si un proceso se está ejecutando, ya que es posible que el archivo no se elimine en caso de bloqueo.
Aparte de las condiciones de carrera, a menudo uso pgrep cuando necesito saber si un proceso se está ejecutando. Luego podría hacer una referencia cruzada de la salida con los archivos .pid si lo considerara necesario.
Solución 3:
Un archivo que contiene una identificación de proceso no es confiable para determinar si un proceso se está ejecutando o no. Es solo una fuente confiable para averiguar la última identificación de proceso dada para el proceso.
Cuando tenga la identificación del proceso, debe realizar más comprobaciones, si el proceso realmente se está ejecutando.
Aquí hay un ejemplo:
#!/usr/bin/env sh
file="/var/run/sshd.pid"
processid=$(cat /var/run/sshd.pid)
if [ ! -f ${file} ]; then
echo "File does not exists: ${file}"
exit 1
fi
if [ ! -r ${file} ]; then
echo "Insufficient file persmissons: ${file}"
exit 1
fi
psoutput=$(ps -p ${processid} -o comm=)
if [ $? == 0 ];then
if [ ${psoutput} == "sshd" ]; then
echo "sshd process is realy running with process id ${processid}"
exit 0
else
echo "given process id ${processid} is not sshd: ${psoutput}"
exit 1
fi
else
echo "there is no process runing with process id ${processid}"
exit 0
fi
pgrep es un buen comando, pero te meterás en problemas cuando tengas varias instancias ejecutándose. Por ejemplo, cuando tiene un sshd normal ejecutándose en el puerto TCP/22 y tiene otro sshd ejecutándose en el puerto TCP/2222, pgrep entregará dos ID de proceso cuando busque sshd ... cuando el sshd normal tiene su pid en /var/run/sshd.pid y el otro podría tener su pid en /var/run/sshd-other.pid se pueden diferenciar claramente los procesos.
Yo no recomiendo usar solo ps , tubería a través de una o varias tuberías con grep y grep-v tratando de filtrar todas las demás cosas que no le interesan... es un poco como usar
find . | grep myfile
para averiguar si un archivo existe.
Solución 4:
No es fiable comprobar simplemente la existencia de un proceso con el mismo pid que contiene el archivo.
Pero muchas implementaciones de pidfile también bloquean el pidfile, de modo que si el proceso muere, el bloqueo desaparece. Siempre que el mecanismo de bloqueo sea confiable, verificar si el archivo aún está bloqueado es un mecanismo relativamente confiable para determinar si el proceso original aún se está ejecutando.