Tengo un script que debe ejecutarse cada cinco segundos. Sé que cronpuede hacer tareas por minuto, pero ¿hay alguna manera de ejecutar algo cada segundo?
¿Que problema estas tratando de resolver? ¿Estás seguro de que cron es la solución correcta?
andol
1
Sé que cron no es la solución correcta. Estaba diciendo que no estaba en la pregunta. Por favor lee. Estoy tratando de ejecutar un script cada 5 segundos.
myusuf3
2
Lo siento, supongo que me equivoqué un poco. Sin embargo, todavía se pregunta si está tratando de resolver el problema correcto.
andol
Para las personas que vienen aquí buscando cómo ejecutar algo cada 5 segundos. En su lugar, recomiendo que veas cómo aprender a programar en tiempo real con herramientas como socket.io como ejemplo.
Brandon Bertelsen
¿Has descubierto el comando bash sleep? sleep 5pausa (quizás dentro de un bucle) durante 5 segundos) ...?
SDsolar
Respuestas:
64
Cron solo permite un mínimo de un minuto. Lo que podría hacer es escribir un script de shell con un bucle infinito que ejecute su tarea, y luego duerme durante 5 segundos. De esa manera, su tarea se ejecutará más o menos cada 5 segundos, dependiendo de cuánto tiempo tome la tarea.
#!/bin/bashwhile true;do# Do something
sleep 5;done
Puede crear un my-task.sharchivo con el contenido anterior y ejecutarlo con sh my-task.sh. Opcionalmente, puede configurarlo supervisorcomo un servicio para que se inicie cuando se inicie el sistema, etc.
Realmente parece que estás haciendo algo que probablemente no deberías estar haciendo. Esto se siente mal .
Uno puede necesitar un cron que se ejecute cada 5 o incluso menos segundos para ser utilizado en scrapers basados en PHP.
Ravish Kumar
Realmente se siente mal. Si lo incluye en un trabajo cron, tendrá trabajos superpuestos cada minuto. Después de una hora, se iniciarán 60 trabajos cada 5 segundos. Si no lo incluye en un trabajo cron, bueno, es posible que no pueda saber cómo detenerlo, o incluso saber que existe.
SeF
35
Podría hacer que un crontrabajo inicie un script cada minuto que inicie 12 procesos en segundo plano, por lo tanto:
Bueno, esto fue útil para mí cuando hice un script que revisa repetidamente el /mediadirectorio de una unidad que
conecto
32
What on EARTH- estadísticas, recolección de basura, sincronización de archivos, estado en línea, lo que sea.
ruX
3
Referencia a API externa para datos casi en tiempo real. Ejecutar la solicitud cada 5 segundos es MUCHO mejor que hacerlo en cada página vista.
Sergey Kudriavtsev
1
¿Qué pasa si crontab ejecuta el archivo dostuff.sh dos veces? Por ejemplo, a los 55 segundos, el script se ejecuta pero aún no ha terminado, pero el cron vuelve a llamar al script, ¿qué sucederá?
TomSawyer
2
¡ESTO ES MALO! Potencialmente, ejecuta el script más de una vez a la vez (si tarda más de 5 segundos), lo que podría conducir a una condición de carrera en cualquier archivo (incluso temporal) al que se acceda. ¡NO HAGA ESTO si hacer lo mismo dos veces al mismo tiempo puede causar un problema! (¡Y eso generalmente lo hará!)
Nonny Moose
27
Solo usa un bucle:
while true ;do./your-script & sleep 5;done
Esto iniciará su script como un trabajo en segundo plano, dormirá durante 5 segundos y luego volverá a recorrerlo. Puede usar Ctrl-C para abortarlo, o usar cualquier otra condición en lugar de true, por ejemplo, ! test -f /tmp/stop-my-scriptpara hacer un bucle mientras el archivo /tmp/stop-my-scriptno exista.
Si incluyo el ampersand, dice bash: syntax error near unexpected token ';', entonces lo saqué. Tengo bash 4.3.11. Mi comando se ejecuta rápidamente, así que está bien si se ejecuta en primer plano.
Tyler Collier
1
@TylerCollier Si necesita ./your-scriptejecutar en segundo plano (durante el sueño de 5 segundos), puede mantener &pero soltar el ;. Como &sirve para separar los comandos, es innecesario (y aparentemente no está permitido) tenerlo ;después en la misma línea. Otra forma es escribir el bucle en varias líneas (con un salto de línea después &y, opcionalmente, saltos de línea después doy antes donetambién). Como el ;after &parece ser un error tipográfico, lo eliminé. blueyed: no dude en poner la parte de ;atrás si realmente lo desea; Si es así, sugiero también agregar una explicación.
Eliah Kagan
@EliahKagan FWIW, funciona en Zsh (sin error de sintaxis), pero no es realmente necesario. Gracias por la edición!
azulado
10
Podrías usar el paquete GNU mcron , una alternativa de "Vixie cron".
"Puede permitir fácilmente que se especifiquen puntos de tiempo más finos, es decir, segundos. En principio, esto podría extenderse a microsegundos, pero esto no se implementa".
Parece que Quartz no es de código abierto. ¿Es esto correcto?
txwikinger el
Tiene una versión de código abierto. No tiene una página, solo ve a la página de descarga. No tiene que completar el formulario, solo haga clic en llevarme a la descarga.
Use cactus para monitorear el enrutador y el conmutador, pero Cron solo permite un mínimo de un minuto, por lo que si un puerto / dispositivo está inactivo, no hay advertencia hasta dos minutos después.
Recomiendo editar esta respuesta para expandirla con detalles específicos sobre cómo hacerlo. (Consulte también ¿Cómo escribo una buena respuesta? Para obtener consejos generales sobre qué tipos de respuestas se consideran más valiosas en Ask Ubuntu.)
David Foerster
2
Puede usar una unidad de temporizador SystemD, que activará un servicio, que configuraría para hacer lo que quiera, cada 5 segundos.
Supongamos que se llama a su unidad de servicio mystuff.servicey se instala en ella /etc/systemd/system(consulte los servicios de usuario de SystemD si desea reemplazar el crontab de un usuario), luego puede escribir una unidad de temporizador para ejecutar el servicio en el momento del arranque y luego cada 5 segundos, de esta manera:
Es la mejor solución, el único inconveniente es que cron es mucho más fácil de ver y configurar. SystemD es una molestia y comienza con su estructura de directorios. Sigue siendo el mejor para un intervalo de 5 segundos
John
¿No iría el fragmento anterior en /etc/systemd/system/mystuff.timer en lugar de mystuff.service?
Brooks
@Brooks: sí, mi mal - mal copiar y pegar de mi lado. Fijo.
Guss
Gracias ... me alegra saber que no estoy loco mientras estoy aprendiendo systemd :)
Brooks
1
He hecho este tipo de cosas con mucho éxito (y el resultado final aumenta semanas a la vez, hasta que se reinicia la máquina). En cuanto a lo que estaba haciendo en este momento, actualizar la información y ponerla en caché, actualizándola cada 10 segundos.
#!/bin/sh
SLEEP=5# do stuff
sleep $SLEEP# do stuff
sleep $SLEEP# do stuff
sleep $SLEEP# do stuff
sleep $SLEEP# echo and restart...
exec $0
El 'exec $ 0' reinicia el script, pero reemplaza el script en ejecución. Inicialmente se puede iniciar con una línea crontab '@reboot'.
sleep 5
pausa (quizás dentro de un bucle) durante 5 segundos) ...?Respuestas:
Cron solo permite un mínimo de un minuto. Lo que podría hacer es escribir un script de shell con un bucle infinito que ejecute su tarea, y luego duerme durante 5 segundos. De esa manera, su tarea se ejecutará más o menos cada 5 segundos, dependiendo de cuánto tiempo tome la tarea.
Puede crear un
my-task.sh
archivo con el contenido anterior y ejecutarlo consh my-task.sh
. Opcionalmente, puede configurarlosupervisor
como un servicio para que se inicie cuando se inicie el sistema, etc.Realmente parece que estás haciendo algo que probablemente no deberías estar haciendo. Esto se siente mal .
fuente
Podría hacer que un
cron
trabajo inicie un script cada minuto que inicie 12 procesos en segundo plano, por lo tanto:dostuff.sh
:Sin embargo, mi pregunta es: ¿Qué podría hacer en la TIERRA que necesita ejecutarse cada 5 segundos?
fuente
/media
directorio de una unidad queWhat on EARTH
- estadísticas, recolección de basura, sincronización de archivos, estado en línea, lo que sea.Solo usa un bucle:
Esto iniciará su script como un trabajo en segundo plano, dormirá durante 5 segundos y luego volverá a recorrerlo. Puede usar Ctrl-C para abortarlo, o usar cualquier otra condición en lugar de
true
, por ejemplo,! test -f /tmp/stop-my-script
para hacer un bucle mientras el archivo/tmp/stop-my-script
no exista.fuente
bash: syntax error near unexpected token ';'
, entonces lo saqué. Tengo bash 4.3.11. Mi comando se ejecuta rápidamente, así que está bien si se ejecuta en primer plano../your-script
ejecutar en segundo plano (durante el sueño de 5 segundos), puede mantener&
pero soltar el;
. Como&
sirve para separar los comandos, es innecesario (y aparentemente no está permitido) tenerlo;
después en la misma línea. Otra forma es escribir el bucle en varias líneas (con un salto de línea después&
y, opcionalmente, saltos de línea despuésdo
y antesdone
también). Como el;
after&
parece ser un error tipográfico, lo eliminé. blueyed: no dude en poner la parte de;
atrás si realmente lo desea; Si es así, sugiero también agregar una explicación.Podrías usar el paquete GNU mcron , una alternativa de "Vixie cron".
http://www.gnu.org/software/mcron/manual/mcron.html#Top
"Puede permitir fácilmente que se especifiquen puntos de tiempo más finos, es decir, segundos. En principio, esto podría extenderse a microsegundos, pero esto no se implementa".
fuente
mcron
requieresendmail
ser instalado y activado por defecto. ¿Cómo deshabilitarlo?La configuración mínima en cron es de minutos, no puede configurarla durante 5 segundos. Podrías usar Quartz que permite segundos. http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html
fuente
Use cactus para monitorear el enrutador y el conmutador, pero Cron solo permite un mínimo de un minuto, por lo que si un puerto / dispositivo está inactivo, no hay advertencia hasta dos minutos después.
fuente
Puede usar una unidad de temporizador SystemD, que activará un servicio, que configuraría para hacer lo que quiera, cada 5 segundos.
Supongamos que se llama a su unidad de servicio
mystuff.service
y se instala en ella/etc/systemd/system
(consulte los servicios de usuario de SystemD si desea reemplazar el crontab de un usuario), luego puede escribir una unidad de temporizador para ejecutar el servicio en el momento del arranque y luego cada 5 segundos, de esta manera:/etc/systemd/system/mystuff.timer
Luego, vuelva a cargar la configuración del sistema, active la unidad del temporizador e iníciela.
fuente
He hecho este tipo de cosas con mucho éxito (y el resultado final aumenta semanas a la vez, hasta que se reinicia la máquina). En cuanto a lo que estaba haciendo en este momento, actualizar la información y ponerla en caché, actualizándola cada 10 segundos.
El 'exec $ 0' reinicia el script, pero reemplaza el script en ejecución. Inicialmente se puede iniciar con una línea crontab '@reboot'.
fuente
while
bucle en lugar de reiniciar repetidamente el script?