¿Hay alguna manera de ejecutar un script cada minuto (o 2, o 5, etc.), pero solo si aún no se está ejecutando?
Tenemos un conjunto de scripts que deben ejecutarse cada minuto. A veces pueden comenzar y terminar en un segundo, otras veces pueden continuar durante 5 minutos.
Nuestra forma actual de evitar ejecuciones simultáneas es estableciendo un is_running
indicador en cada script y saliendo si aún está habilitado. Pero esto es poco confiable (es decir, los errores fatales causarían que el indicador permanezca habilitado incluso después de que el script se detenga).
Podríamos escribir nuestro propio pequeño administrador, pero me pregunto si ya existe una solución más moderna.
Respuestas:
una mejor manera es usar en
flock
lugar de un archivo pid. verifique la página de manual: flock (1) . La ventaja es que no importa cómo termine / muera un proceso, la cerradura desaparece con él.fuente
Tendería a estar de acuerdo con la respuesta del archivo pid de Warner. Sin embargo, ¿la siguiente característica de Anacron logra esto?
No lo he probado yo mismo, no encuentro la documentación de anacron lo suficientemente completa ...
Si desea ser particularmente perezoso ;-) Puede hacer que la secuencia de comandos salga si greping a través de la salida ps devuelve el proceso como en ejecución. Pero un archivo de bloqueo / pid es lo mejor.
fuente
anacron
y quécron
hacer, pero resuelven diferentes problemas. Utilizandocron
, ¿cómo comenzaría un trabajo que se perdió porque una máquina no funcionaba? Utilizandoanacron
, ¿cómo comenzaría un trabajo cada 25 de diciembre o cada 5 minutos? (Por supuesto, puede solucionar el guión, pero eso no es de lo que estoy hablando).anacron
no se ejecuta en períodos más cortos que un día.Esa es la solución adecuada para ese enfoque. Normalmente, se usaría un archivo pid y se realizaría una prueba pid contra el proceso para asegurar que se esté ejecutando. Si está obsoleto, el archivo de bloqueo se eliminará y el proceso se ejecutará de todos modos.
Cualquier inteligencia adicional normalmente se escribiría en el propio software, como un demonio, en lugar de ejecutarse en cron.
fuente
Si sus secuencias de comandos están codificadas en un lenguaje que admite la llamada al sistema flock (2), entonces también puede agrupar () un archivo de bloqueo con una llamada a la función. Ejemplo:
Si está atrapado con Bash u otro lenguaje de secuencias de comandos que no lo admite, la solución ya propuesta con flock (1) también está bien.
PD En cualquier caso, debe crear un archivo de bloqueo por separado solo una vez (si aún no existe), y nunca eliminarlo. El directorio "/ var / lock" es un buen lugar para dichos archivos.
fuente
Esta es una solución si su script se ejecuta en python (o podría crear un comando de python para que se ejecute antes del siguiente comando). La semana pasada me topé con este problema exacto, y aunque encontré algunas buenas soluciones, decidí hacer un paquete de python simple y limpio y lo subió a PyPI. Ciertamente podría bloquear
__file__
para no tener que pensar en darle un nombre de recurso personalizado para bloquear.Instalar con:
pip install quicklock
Usarlo es extremadamente simple:
Echa un vistazo: https://pypi.python.org/pypi/quicklock
fuente