GNU/Linux >> Tutoriales Linux >  >> Linux

¿Los archivos .pid son confiables para determinar si un proceso se está ejecutando?

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.


Linux
  1. ¿Cambiar el entorno de un proceso en ejecución?

  2. Verifique el límite de FD abierto para un proceso dado en Linux

  3. Cómo configurar la ID del proceso en Linux para un programa específico

  4. Conteo de archivos abiertos por proceso

  5. ¿Cuál es el PID en el host de un proceso que se ejecuta dentro de un contenedor Docker?

Biblioteca de Python para la gestión de procesos de Linux

Máximo de archivos abiertos para el proceso de trabajo

¿Cómo verificar qué bibliotecas compartidas se cargan en tiempo de ejecución para un proceso determinado?

¿Por qué los archivos .so son ejecutables?

¿Qué son las señales pendientes?

Cómo encontrar el archivo .pid para un proceso dado