Así que estoy tratando de configurar un trabajo cron como una especie de perro guardián para un demonio que he creado. Si el daemon falla y falla, quiero que el trabajo cron lo reinicie periódicamente ... No estoy seguro de lo posible, pero leí un par de tutoriales cron y no pude encontrar nada que hiciera lo que yo quería. estoy buscando ...
Mi demonio comienza desde un script de shell, por lo que realmente solo estoy buscando una manera de ejecutar un trabajo cron SOLAMENTE si la ejecución anterior de ese trabajo aún no se está ejecutando.
Encontré esta publicación , que proporcionó una solución para lo que estoy tratando de hacer usando archivos de bloqueo, no estoy seguro de si hay una mejor manera de hacerlo ...
Gracias por tu ayuda.
grep -v grep | grep doctype.php
que puedas hacergrep [d]octype.php
.&
cron ejecute el script.Uso
flock
. Es nuevo. Es mejor.Ahora no tiene que escribir el código usted mismo. Vea más razones aquí: https://serverfault.com/a/82863
fuente
setlock
,s6-setlock
,chpst
, Yrunlock
en sus modos no bloqueantes son alternativas que están disponibles en algo más que Linux. unix.stackexchange.com/a/475580/5132Como han dicho otros, escribir y verificar un archivo PID es una buena solución. Aquí está mi implementación de bash:
fuente
>
" versus ">>
". Lo siento por eso.[ -e "${PIDFILE}" ]
". Si no es así, iniciará el programa en segundo plano, escriba su PID en un archivo ("echo $! > "${PIDFILE}"
") y Si el archivo PID existe, el script verificará sus propios procesos ("ps -u $(whoami) -opid=
") y verá si está ejecutando uno con el mismo PID ("grep -P "^\s*$(cat ${PIDFILE})$"
"). Si no lo está, iniciará el programa como antes, sobrescribir el archivo PID con el nuevo PID, y la salida no veo ninguna razón para modificar la secuencia de comandos;.? ¿verdadEs sorprendente que nadie haya mencionado sobre run-one . He resuelto mi problema con esto.
luego agregue
run-one
antes de su secuencia de comandos crontabMira esta respuesta de askubuntu SE. Puede encontrar el enlace a una información detallada allí también.
fuente
No intentes hacerlo a través de cron. Haga que cron ejecute un script sin importar qué, y luego haga que el script decida si el programa se está ejecutando y lo inicie si es necesario (tenga en cuenta que puede usar Ruby o Python o su lenguaje de script favorito para hacer esto)
fuente
También puede hacerlo como una línea directamente en su crontab:
fuente
ps -ef|grep [c]ommand
-eq 0] && <comando> donde envolver la primera letra de su comando entre paréntesis lo excluye de los resultados grep.[ "$(ps -ef|grep [c]ommand|wc -l)" -eq 0 ] && <command>
[ $(grep something | wc -l) -eq 0 ]
es una forma realmente indirecta de escribir! grep -q something
. Así que simplemente quieresps -ef | grep '[c]ommand' || command
grep -c
La forma en que lo hago cuando ejecuto scripts php es:
El crontab:
El código php:
Este comando está buscando en la lista de procesos del sistema el nombre de archivo php actual si existe, el contador de línea (wc -l) será mayor que uno porque el comando de búsqueda en sí contiene el nombre de archivo
así que si ejecuta php crons, agregue el código anterior al inicio de su código php y se ejecutará solo una vez.
fuente
Como seguimiento a la respuesta de Earlz, necesita una secuencia de comandos de envoltura que cree un archivo $ PID.running cuando se inicie y se elimine cuando finalice. El script de reiniciador llama al script que desea ejecutar. El contenedor es necesario en caso de que el script de destino falle o se produzca un error, el archivo pid se elimina.
fuente
Con
lockrun
usted no necesita escribir un script de envoltura para su trabajo cron. http://www.unixwiz.net/tools/lockrun.htmlfuente
Recomendaría usar una herramienta existente como monit , monitoreará y reiniciará automáticamente los procesos. Hay más información disponible aquí . Debería estar fácilmente disponible en la mayoría de las distribuciones.
fuente
Este nunca me falló:
one.sh :
trabajo cron :
fuente
ACTUALIZACIÓN ... mejor forma de usar flock:
fuente
Sugeriría lo siguiente como una mejora a la respuesta de rsanden (publicaría como un comentario, pero no tengo suficiente reputación ...):
Esto evita posibles falsas coincidencias (y la sobrecarga de grepping), y suprime la salida y se basa solo en el estado de salida de ps.
fuente
ps
comando coincidiría con los PID de otros usuarios en el sistema, no solo el suyo. Agregar un "-u
" alps
comando cambia la forma en que funciona el estado de salida.PHP personalizado simple es suficiente para lograr. No es necesario confundirlo con el script de shell.
supongamos que desea ejecutar php /home/mypath/example.php si no se está ejecutando
Luego use el siguiente script php personalizado para hacer el mismo trabajo.
crear siguiente /home/mypath/forever.php
Luego, en su cron, agregue lo siguiente
fuente
Considere usar pgrep (si está disponible) en lugar de ps canalizado a través de grep si va a seguir esa ruta. Aunque, personalmente, tengo mucho kilometraje de los scripts de la forma
Aunque esto puede fallar y los trabajos cron son a menudo la mejor manera de hacer cosas esenciales. Solo otra alternativa.
fuente
Documentos: https://www.timkay.com/solo/
Ejemplo
fuente