Mar 272015
 
Artículo Administración de Servidores

En un servidor linux, es habitual encontrar ciertos procesos que se ejecutan periódicamente, mediante entradas en cron. Algunos tienen una periodicidad de un mes, una semana o un día, pero otros deben ser ejecutados en períodos de tiempo mucho más cortos, de uno o dos minutos.

En ocasiones, el tiempo de ejecución de estos procesos puede ser muy variable, y eventualmente puede ocurrir que un proceso esté todavía ejecutándose cuando llega el momento de volver a ejecutar dicho proceso. Esto puede provocar problemas graves, dependiendo del tipo de tarea que lleva a cabo el proceso.

En este artículo se explica cómo detectar esta circunstancia, y evitar que un mismo proceso se ejecute más de una vez concurrentemente.

El caso típico que puede provocar el tipo de problema que estamos comentando es el de un script de mantenimiento que se ejecuta frecuentemente mediante una entrada en cron:

En este ejemplo, el script “mantenimiento.php” es ejecutado cada dos minutos.

Pero si el script tiene que realizar algún tipo de proceso que ocasionalmente requiera más tiempo de lo previsto (como por ejemplo descargar algún contenido a través de internet), puede llegar a ocurrir que al cabo de dos minutos todavía no haya terminado su ejecución.

En los sistemas Linux más recientes está disponible la utilidad “flock”, que detecta este caso, y evita que un proceso vuelva a ser ejecutado mientras el anterior proceso no ha finalizado. Para hacer uso de la misma, reescribimos la entrada en cron:

Cada vez que se ejecuta, la utilidad flock crea un acceso exclusivo a un fichero auxiliar “/tmp/mant.lock”, y lanza la ejecución del proceso mantenimiento.php. Cuando finaliza la ejecución, flock elimina el acceso exclusivo al fichero auxiliar.

Si al intentar crear el acceso exclusivo se produce un error porque el anterior proceso no ha finalizado, la acción por defecto de flock es esperar a que se libere el recurso, y a continuación ejecutar el proceso. Con la opción “-n” flock finaliza inmediatamente, sin ejecutar el proceso.

En versiones anteriores de Linux para las cuales no está disponible la utilidad flock, existen alternativas tales como lockrun o lckdo, que se pueden obtener fácilmente haciendo una búsqueda en internet.

 Publicado por en 10:24 am

 Deja un comentario

(requerido)

(requerido)