¿Es posible ejecutar un trabajo cron cada 30 segundos sin un comando de suspensión?
¿Es posible ejecutar un trabajo cron cada 30 segundos sin un comando de suspensión?
Respuestas:
Si su tarea necesita ejecutarse con esa frecuencia, cron es la herramienta incorrecta. Además del hecho de que simplemente no lanzará trabajos con tanta frecuencia, también corre el riesgo de tener problemas serios si el trabajo tarda más en ejecutarse que el intervalo entre lanzamientos. Vuelva a escribir su tarea para demonizar y ejecutar de forma persistente, luego iníciela desde cron si es necesario (asegurándose de que no se reinicie si ya se está ejecutando).
run-one
para asegurarse de que un programa / incluso un script PHP no esté iniciando una instancia duplicada. sudo apt-get install run-one
y llámalo porrun-one <normal command>
Candidato para el mal uso más creativo de un comando de Linux:
nohup watch -n 30 --precise yourprog >/dev/null &
Si yourprog
consiste en:
date +%M.%S.%N >> yourprog.out
entonces yourprog.out
podría verse así:
50.51.857291267
51.21.840818353
51.51.840910204
52.21.840513307
52.51.842455224
53.21.841195858
53.51.841407587
54.21.840629676
indicando un muy buen nivel de precisión.
Aquí hay una explicación de las partes del comando:
nohup
- Esto evita que el comando que le sigue, watch
en este caso, salga cuando el terminal salga.watch
- Este programa ejecuta un comando repetidamente. Normalmente, la primera pantalla llena de resultados del comando se muestra cada vez que se watch
ejecuta el comando.-n 30
- El intervalo para ejecutar el comando. En este caso es cada treinta segundos.--precise
- Sin esta opción, watch
ejecuta el comando después de un intervalo de segundos. Con él, cada inicio del comando comienza en el intervalo si es posible. Si esta opción no se especificara en el ejemplo, los tiempos llegarían más tarde y más tarde en más de 30 segundos cada vez debido al tiempo que lleva iniciar y ejecutar el comando ( yourprog
).yourprog
- El programa o línea de comando para watch
ejecutar. Si la línea de comando contiene caracteres especiales para el shell (por ejemplo, espacio o punto y coma), será necesario citarlo.>/dev/null
- El mayor que vuelve a dirigir la salida del comando que se ejecuta mediante watch
un archivo, /dev/null
. Ese archivo descarta cualquier dato escrito en él. Esto evita que la salida se escriba en la pantalla o, dado que nohup
se está utilizando, evita que la salida se envíe a un archivo llamado nohup.out
.&
- El watch
comando se ejecuta en segundo plano y el control se devuelve al terminal o proceso principal.Tenga en cuenta que nohup
la redirección de salida y el &
operador de control de fondo no son específicos de watch
.
Aquí hay una explicación del yourprog
script de ejemplo :
date
- Emite la fecha y / o hora actual. También puede configurarlos.+%M.%S.%N
- Esto especifica el formato de salida para date
usar. %M
es el minuto actual, %S
es el segundo actual y %N
es el nanosegundo actual.>> yourprog.out
- Esto redirige la salida del date
comando a un archivo llamado yourprog.out
. El doble mayor que hace que la salida se agregue al archivo en cada invocación en lugar de que se sobrescriban los contenidos anteriores.Editar :
Posiblemente otra cosa que podría abusarse (o tal vez sea un uso legítimo) son los temporizadores systemd.
Ver systemd / Timers como un reemplazo de cron y Cron vs temporizadores systemd .
Intentaré publicar un ejemplo pronto.
&
hace que el comando se ejecute en segundo plano, devolviendo el control al símbolo del sistema inmediatamente. El uso del nohup
comando hace que el proceso en segundo plano (en este caso watch
) ignore la señal de bloqueo que se envía cuando sale el shell, como cuando cierra el terminal. ...
>/dev/null
hace que la salida se descarte y evita la creación de un nohup.out
archivo que de otro modo se crearía cuando la salida estándar es un terminal.
sleep
, necesitaría escribir un ciclo para que el proceso se repita ( watch
esto se repite para usted, al igual que cron
). Aún necesitarías nohup
y &
. Un problema adicional con sleep
sería la deriva del tiempo. La --precise
opción de watch
evita esto. Sin él o cuando se usa sleep
en un bucle, el intervalo de tiempo tiene el tiempo que tardan los comandos o la secuencia de comandos en agregarse, por lo que cada ejecución se hace más tarde y más tarde que ...
Cron está diseñado para despertarse a cada minuto, por lo que no es posible hacerlo sin algún hackeo, por ejemplo, dormir como usted mencionó.
* * * * * /path/to/program
* * * * * sleep 30; /path/to/program
No olvides escribir algo en tu programa para que salga si ya se está ejecutando una instancia anterior.
#!/bin/sh
if ln -s "pid=$$" /var/pid/myscript.pid; then
trap "rm /var/pid/myscript.pid" 0 1 2 3 15
else
echo "Already running, or stale lockfile." >&2
exit 1
fi
Por supuesto, esto todavía deja una oportunidad muy pequeña para el fracaso, así que busque en Google una mejor solución aplicable a su entorno.
without a sleep command
Puede hacer esto con software de terceros.
Una opción que me ha funcionado bien es frecuente-cron
Permite una precisión de milisegundos y le da la opción de diferir la próxima ejecución hasta que la actual haya salido.
Tendría un par de preocupaciones:
(1) a veces un sistema se llena y no puede comenzar las cosas exactamente en el punto de 30 segundos, entonces es posible que al mismo tiempo que esté ejecutando un trabajo aparezca otro trabajo y luego tenga 2 (o más) trabajos haciendo lo mismo cosa. Dependiendo del guión, puede haber alguna interferencia significativa aquí. Por lo tanto, la codificación en un script de este tipo debe contener algún código para garantizar que solo se ejecute una instancia del script al mismo tiempo.
(2) La secuencia de comandos podría tener muchos gastos generales y consumir más recursos del sistema de los que podría desear. Esto es cierto si compite contra muchas otras actividades del sistema.
Por lo tanto, como lo expresó un afiche, en este caso consideraría seriamente poner en ejecución un demonio con procesos adicionales para garantizar que siga ejecutándose si es de importancia crítica para sus operaciones.
entrada cron:
* * * * * flock -w0 /path/to/script /path/to/script
guión:
while true;do echo doing something; sleep 10s;done
* * * * * flock -w0 /path/to/log watch -n 10 echo doing >> /path/to/log
o
* * * * * flock -w0 /path/to/log watch -n 10 /path/to/script
flock
comando evita ejecutar el script en varias instancias al mismo tiempo. Puede ser muy importante en la mayoría de los casos.flock
y los watch
comandos están disponibles en la mayoría de las instalaciones de Linuxwatch
comandoUna solución, si es para su propio script o si puede envolverlo:
Menos dolor de cabeza que construir y monitorear un demonio.
* Si está utilizando PHP, recuerde clearstatcache ().