¿Para qué sirven los archivos pid y lock?

75

A menudo veo que los programas especifican archivos pid y lock. Y no estoy muy seguro de lo que hacen.

Por ejemplo, al compilar nginx:

--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \

¿Alguien puede arrojar algo de luz sobre este?

Stann
fuente

Respuestas:

86

Algunos archivos escriben archivos pid para registrar su ID de proceso mientras se inician. Esto tiene múltiples propósitos:

  • Es una señal para otros procesos y usuarios del sistema que ese programa en particular se está ejecutando, o al menos se inició con éxito.
  • Le permite a uno escribir un script realmente fácil de verificar si se está ejecutando y emitir un killcomando simple si uno quiere finalizarlo.
  • Es una forma económica de que un programa vea si una instancia anterior en ejecución no salió con éxito.

La mera presencia de un archivo pid no garantiza que esa identificación de proceso en particular se esté ejecutando, por supuesto, por lo que este método no es 100% infalible sino "lo suficientemente bueno" en muchos casos. Comprobar si existe un PID en particular en la tabla de procesos no es totalmente portátil en los sistemas operativos tipo UNIX a menos que desee depender de la psutilidad, que puede no ser conveniente llamar en todos los casos (y creo que algunos sistemas operativos tipo UNIX implementar de manera psdiferente de todos modos).

Los programas usan archivos de bloqueo para garantizar que dos instancias separadas (con buen comportamiento) de un programa, que pueden estar ejecutándose simultáneamente en un sistema, no accedan a otra cosa al mismo tiempo. La idea es que antes de que el programa acceda a su recurso, verifique la presencia de un archivo de bloqueo y, si el archivo de bloqueo existe, ya sea un error o espere a que desaparezca. Cuando no existe, el programa que quiere "adquirir" el recurso crea el archivo, y luego otras instancias que puedan surgir más adelante esperarán a que se complete este proceso. Por supuesto, esto supone que el programa "adquiriendo" el bloqueo, de hecho, lo libera y no se olvida de eliminar el archivo de bloqueo.

Esto funciona porque el sistema de archivos en todos los sistemas operativos similares a UNIX impone la serialización , lo que significa que solo un cambio en el sistema de archivos ocurre en cualquier momento dado. Algo así como cerraduras con bases de datos y tal.

LawrenceC
fuente
1
Esto es correcto, a menos que el archivo de bloqueo se elimine manualmente. VMWare Player exhibe este comportamiento, por ejemplo, si VMWare Player falla, debe eliminar un .lckarchivo en el directorio de la VM; de lo contrario, le dirá que está en uso cuando intente iniciarlo.
LawrenceC
1
¿Qué hay de Windows? ¿Cómo maneja los archivos .lock? Después de todo, no es como Unix.
SarahofGaia
2
No creo que sea común que los programas de Windows funcionen de esta manera. Los únicos programas con este comportamiento que he visto son los puertos de Unix / Linux
HaMster
2
LawrenceC, Re " Cuando no existe, el programa que quiere" adquirir "el recurso crea el archivo "; Pero hay funciones adecuadas específicamente creadas para hacer tal sincronización. ¿Por qué no confiar en esas funciones en lugar de utilizar el "pirateo de archivos"?
Pacerier
1
@Pacerier: los archivos de bloqueo de esta manera probablemente se usan con más frecuencia por cosas como scripts de shell o programas que pueden interactuar con scripts de shell, ya que los shells de Unix / Linux interactúan con el sistema de archivos muy fácilmente, en comparación con otras primitivas de sincronización. Los archivos también persisten fácilmente en procesos dispares. Un programa de alto rendimiento obviamente probablemente preferiría primitivas nativas del sistema operativo frente a archivos para sincronizar cosas internamente o incluso frente a otros procesos que no son shells.
LawrenceC
14

Los demonios suelen utilizar estos archivos que solo deben ejecutarse una vez en un sistema. El archivo PID generalmente contiene el número de identificación del proceso del programa ya iniciado y en ejecución, si existe. Además, cuando se inicia, crea el archivo de bloqueo. Mientras exista el archivo de bloqueo, no se iniciará otro sin intervención del usuario. Si el archivo de bloqueo existe y la identificación del proceso mencionada en el archivo pid no se está ejecutando, se considera que el demonio está en estado "inactivo", lo que significa que se supone que se está ejecutando, pero probablemente no se deba a un bloqueo o apagado incorrecto . Esto podría iniciar un escenario especial de inicio / reinicio para algunos programas. Si lo cierra correctamente, eliminará el archivo de bloqueo.

Caleb
fuente
+1 Explica el uso de tener tanto el archivo de bloqueo como el archivo pid.
Kyle Krull
@Caleb: explique por qué se utilizarían tanto un archivo PID como un archivo de bloqueo. Parece que un archivo PID sería suficiente. Si el archivo PID existe, el PID podría verificarse para ver si el proceso se está ejecutando, solo toma menos pasos que verificar un archivo de bloqueo, verificar un archivo PID y luego verificar la existencia del proceso.
MVaughan
@MVaughan Para evitar condiciones de carrera si nada más. Algunas aplicaciones tienen usos para momentos en que todavía necesitan el PID pero pueden renunciar al bloqueo. Pero a un nivel más fundamental si sobrecarga un archivo para ambas operaciones, abre la puerta a fallas como un bloqueo que deja un estado inconsistente en el sistema.
Caleb
8

Un archivo PID contendrá la ID de proceso de un proceso en ejecución. Esto tiene varios usos; puede leerlo y verificar que el proceso aún se esté ejecutando y tomar las medidas adecuadas o leerlo y finalizar el proceso.

Es muy probable que un archivo de bloqueo sea específico de la aplicación. Los archivos de bloqueo se usan para indicar que algún recurso está en uso y que el proceso que desea acceder debe esperar hasta que se libere el recurso antes de continuar.


fuente