¿Son confiables los archivos .pid para determinar si se está ejecutando un proceso?

11

Muchos programas como sshd crean archivos .pid en / var / run / que contienen su ID de proceso. ¿Son confiables estos archivos para determinar si se está ejecutando un proceso? Supongo que estos archivos se crean manualmente mediante un proceso y, por lo tanto, permanecerán en el sistema de archivos si el programa falla.

indiv
fuente

Respuestas:

16

en términos simples, no : un proceso (por ejemplo, un demonio) puede bloquearse y no tener tiempo para borrar su archivo .pid.

Una técnica para estar más seguro del estado de un programa: use un canal de comunicación explícito como un socket. Escriba el puerto del socket en un archivo y haga que el supervisorproceso lo busque.

También puede usar los servicios de DBus en Linux: registre un nombre específico y haga que el proceso de su supervisor (como lo llame) verifique ese nombre.

Existen numerosas técnicas.

Una cosa para recordar: no es responsabilidad del sistema operativo administrar los archivos PID.

jldupont
fuente
1
Sin embargo, la existencia del archivo pid, COMBINADO con la existencia del proceso, debería ser suficiente. Si el proceso se cierra, puede verificar eso. Los PID se reutilizan, pero no con mucha frecuencia.
MarkR
2
la frecuencia con la que se reutiliza un pid depende del sistema particular en cuestión. He visto un sistema en el que los PID se reciclaban al menos a diario. Debe verificar el pid, que hay un proceso y que el proceso parece ser el que espera que sea el propietario del pid.
@atk: exactamente. No existe un estándar per se e, incluso si existiera, algunas implementaciones pueden no respetarlo. Por ejemplo, puedo crear un demonio que no escriba un archivo PID y usar un canal posterior para obtener sus comandos de administración.
jldupont
@atk: desafortunadamente, no hay manera de garantizar que el PID no se reutilice entre el momento de la verificación y el momento de uso ...
SamB
3

Jldupont tiene razón al afirmar que los archivos .pid no son confiables para determinar si un proceso se está ejecutando ya que el archivo no se puede eliminar en caso de un bloqueo.

Dejando a un lado las condiciones de la carrera, a menudo uso pgrep cuando necesito saber si un proceso se está ejecutando. Entonces podría hacer una referencia cruzada de la salida con los archivos .pid si lo considerara necesario.

jschmier
fuente
3

Un archivo que contiene una identificación de proceso no es confiable, determine si un proceso se está ejecutando o no. Es solo una fuente confiable, para descubrir la última identificación de proceso dada para el proceso.

Cuando tiene la identificación del proceso, debe hacer una comprobación adicional, 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 tendrás 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, entonces pgrep entregará dos identificadores de proceso al buscar 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 puede diferenciar claramente los procesos.

Yo no recomiendo usar solo ps , la tubería a través de uno o varios tubos con grep y grep -v tratando de filtrar toda otra materia que no le interesa ... es un poco como el uso

find . | grep myfile

averiguar, si sale un archivo.

Mirko Steiner
fuente
2

No es confiable simplemente verificar la existencia de un proceso con el mismo pid que figura en el archivo.

Pero muchas implementaciones de archivos pid también se bloquean en el archivo pid, 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.

Paul Brannan
fuente
1

Jldupont es correcto.

Sin embargo, puede enviar al proceso una señal 0 (kill -s 0 pid) para ver si el proceso aún está vivo (suponiendo que tenga la autoridad para enviar dicha señal; en general, solo el propietario de un proceso puede enviar Es una señal).


fuente
44
Pero verificar la existencia de un proceso con ese PID no significa que le interese el PID.
enero
0

Estoy de acuerdo con jschmier.

En algunos sistemas, no tiene acceso a pgrep. En tal caso, puede hacer ps -aef | grep <pid>para averiguar si el proceso realmente se está ejecutando.

usuario29584
fuente
1
El punto clave en la pregunta era "confiable". Hacer una ps y buscar un PID no es confiable.
enero
bueno ... suponiendo que conoces el nombre del programa, ¿por qué crees que ps -aef | grep no es confiable?
user29584
3
Condiciones de carrera: el estado del sistema ha cambiado para cuando ps ha terminado. Títulos de proceso: otro proceso podría tener un título similar al que le interesa. Varias instancias: considere un sistema con dos instancias del mismo servicio, cada una con un archivo PID. Uno falla y el otro se reinicia y obtiene el PID del primer servicio. Como lo dices Etc. No es confiable, imposible de corregir debido a las condiciones de la carrera, y existen técnicas confiables que simplemente funcionan. Para ver una alternativa confiable, consulte, por ejemplo, cr.yp.to/daemontools.html
enero