Referencia para el manejo adecuado del archivo PID en Unix

¿Dónde puedo encontrar una referencia respetada que detalle el manejo adecuado de los archivos PID en Unix?

En los sistemas operativos Unix, es una práctica común “bloquear” un progtwig (a menudo un daemon) mediante el uso de un archivo de locking especial: el archivo PID.

Este es un archivo en una ubicación predecible, a menudo ‘/var/run/foo.pid’. Se supone que el progtwig verifica si se inicia si el archivo PID existe y, si el archivo existe, sale con un error. Entonces, es un tipo de mecanismo de locking colaborativo y de asesoramiento.

El archivo contiene una sola línea de texto, que es la ID del proceso numérico (de ahí el nombre “archivo PID”) del proceso que actualmente contiene el locking; esto permite una manera fácil de automatizar el envío de una señal al proceso que mantiene el locking.

Lo que no puedo encontrar es una buena referencia sobre el comportamiento esperado o de “mejores prácticas” para manejar archivos PID. Hay varios matices: cómo bloquear realmente el archivo (¿no molestar? ¿Usar el kernel ?, ¿qué pasa con las incompatibilidades de plataforma?), Manejar lockings obsoletos (¿eliminarlos silenciosamente ?, ¿cuándo verificar?), Cuándo exactamente adquirir y liberar el locking , Etcétera.

¿Dónde puedo encontrar una referencia respetada y con más autoridad (idealmente en el nivel de W. Richard Stevens) para este pequeño tema?

Por lo que yo sé, los archivos PID son una convención en lugar de algo para lo que se puede encontrar una fuente respetada y en su mayoría autorizada. Lo más cerca que pude encontrar es esta sección del Estándar de jerarquía del sistema de archivos.

Esta biblioteca Perl puede ser útil, ya que parece que el autor al menos ha pensado en algunos problemas que pueden surgir.

Creo que los archivos bajo / var / run a menudo son manejados por los mantenedores de la distro en lugar de los autores de daemons, ya que es la responsabilidad de los desarrolladores de la distribución asegurarse de que todos los scripts de inicio funcionen bien juntos. Revisé la documentación para desarrolladores de Debian y Fedora y no pude encontrar ninguna guía detallada, pero es posible que pueda obtener más información sobre las listas de correo de sus desarrolladores.

En primer lugar, en todos los UNIXes modernos /var/run no persiste durante los reinicios.

El método general para manejar el archivo PID es crearlo durante la inicialización y eliminarlo de cualquier salida, ya sea controlador normal o de señal.

Hay dos formas canónicas para crear / verificar atómicamente el archivo. El principal en estos días es abrirlo con el indicador O_EXCL : si el archivo ya existe, la llamada falla. La forma antigua (obligatoria en sistemas sin O_EXCL ) es crearla con un nombre aleatorio y un enlace a ella. El enlace fallará si el objective existe.

Consulte la Interfaz de progtwigción de Linux de Kerrisk, sección 55.6 “Ejecución de una sola instancia de un progtwig”, que se basa en la implementación del archivo pid en la Progtwigción en red Unix de Stevens, v2.

Tenga en cuenta también que la ubicación del archivo pid es algo manejado por la distribución (mediante un script de inicio), por lo que un daemon bien escrito tomará un argumento de línea de comando para especificar el archivo pid y no permitirá que un archivo de configuración lo sobrescriba accidentalmente. También debe manejar con elegancia un archivo pid por sí mismo (no se debe usar O_EXCL). Se debe usar el locking de archivos fcntl (). Puede suponer que el archivo pid de un daemon se encuentra en un sistema de archivos local (que no es NFS).

Dependiendo de la distribución, en realidad es la secuencia de comandos de inicio que maneja el archivo pid. Comprueba la existencia al inicio, elimina cuando se detiene, etc. No me gusta hacerlo de esa manera. Escribo mis propios scripts de inicio y no utilizo típicamente las funciones de inicio estándar.

Un progtwig bien escrito (daemon) tendrá algún tipo de archivo de configuración que diga dónde debe escribirse este archivo pid (si hay alguno). También se ocupará de establecer manejadores de señal para que el archivo PID se limpie en la salida normal, o anormal, siempre que se pueda manejar una señal. El archivo PID le da al script de inicio el PID correcto para que pueda detenerse.

Por lo tanto, si el archivo pid ya existe al iniciar, es un muy buen indicador del progtwig que se bloqueó anteriormente y debería hacer algún tipo de esfuerzo de recuperación (si corresponde). Dispara esa lógica en el pie si tienes el guión de inicio en sí mismo para verificar la existencia del PID o para desvincularlo.

En cuanto al espacio de nombre, debe seguir el nombre del progtwig. Si estás comenzando ‘foo-daemon’, sería foo-daemon.pid

También debe explorar / var / lock / subsys, sin embargo, eso se usa principalmente en los sabores de Red Hat.

El paquete systemd en Red Hat 7 proporciona un daemon(7) página man daemon(7) con la línea de encabezado “Demonios del sistema de escritura y empaquetado”.

Esta página de manual trata sobre la demonización de “estilo antiguo” (SysV) y “nuevo estilo” (systemd). En un nuevo estilo, systemd maneja los archivos PID por usted (si así está configurado para hacerlo). Sin embargo, en estilo antiguo, la página man tiene esto que decir:

  1. En el proceso del daemon, escriba el PID del daemon (como lo devuelve getpid ()) en un archivo PID, por ejemplo /run/foobar.pid (para un daemon hipotético “foobar”) para garantizar que el daemon no pueda iniciarse más de una vez . Esto debe implementarse de manera libre de competencia para que el archivo PID solo se actualice cuando se verifique al mismo tiempo que el PID previamente almacenado en el archivo PID ya no existe o pertenece a un proceso en el extranjero.

También puede leer esta página de manual en línea .