Ejecutando un cron cada 30 segundos

Ok, tengo un cron que necesito ejecutar cada 30 segundos … esto es lo que tengo a continuación

*/30 * * * * /bin/bash -l -c 'cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\''' 

Se ejecuta pero es en estos 30 minutos o 30 segundos … y también he estado leyendo que cron puede no ser la mejor herramienta para usar si lo ejecuto con tanta frecuencia. ¿Hay alguna otra herramienta mejor que pueda instalar en Ubuntu 11.04 que sea una mejor opción o hay una manera de arreglar el cron anterior?

Tiene */30 en el especificador de minutos , es decir, cada minuto pero con un paso de 30 (en otras palabras, cada media hora). Como cron no baja a resoluciones de minutos, tendrá que encontrar otra forma.

Una posibilidad, aunque es un poco difícil, es tener dos trabajos, uno compensado por 30 segundos:

 * * * * * /path/to/executable param1 param2 * * * * * ( sleep 30 ; /path/to/executable param1 param2 ) 

Ambos trabajos cron realmente se ejecutan cada minuto, pero el último esperará medio minuto antes de ejecutar la “carne” del trabajo, /path/to/executable .

No puedes. Cron tiene una granularidad de 60 segundos.

 * * * * * cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\'' * * * * * sleep 30 && cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\'' 

La granularidad de Cron está en minutos y no fue diseñada para despertarse cada x segundos para ejecutar algo. Ejecute su tarea repetitiva dentro de un ciclo y debería hacer lo que necesita:

 #!/bin/env bash while [ true ]; do sleep 30 # do what you need to here done 

No hay necesidad de dos entradas de cron, puedes ponerlo en uno con:

 * * * * * /bin/bash -l -c "/path/to/executable; sleep 30 ; /path/to/executable" 

entonces en tu caso:

* * * * * /bin/bash -l -c "cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\'' ; sleep 30 ; cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\''"

Puedes ver mi respuesta a esta pregunta similar

Básicamente, he incluido un script bash llamado “runEvery.sh” que se puede ejecutar con cron cada 1 minuto y pasar como argumentos el comando real que desea ejecutar y la frecuencia en segundos en que desea ejecutarlo.

algo como esto

*/1 * * * * ~/bin/runEvery.sh 5 myScript.sh

El trabajo cron no se puede utilizar para progtwigr un trabajo en segundos. es decir, no puede progtwigr una tarea cron para que se ejecute cada 5 segundos. La alternativa es escribir un script de shell que use sleep 5 comando sleep 5 en él.

Cree un script de shell cada 5-seconds.sh usando bash while loop como se muestra a continuación.

 $ cat every-5-seconds.sh #!/bin/bash while true do /home/ramesh/backup.sh sleep 5 done 

Ahora, ejecute este script de shell en segundo plano usando nohup como se muestra a continuación. Esto seguirá ejecutando el script incluso después de que salga de su sesión. Esto ejecutará su script de shell backup.sh cada 5 segundos.

 $ nohup ./every-5-seconds.sh & 

en dir /etc/cron.d/

nuevo crear un archivo excute_per_30s

 * * * * * yourusername /bin/date >> /home/yourusername/temp/date.txt * * * * * yourusername sleep 30; /bin/date >> /home/yourusername/temp/date.txt 

ejecutará cron cada 30 segundos

Use reloj:

 $ watch --interval .30 script_to_run_every_30_sec.sh 

Utilice fcron ( http://fcron.free.fr/ ) – le ofrece granularidad en segundos y mucho mejor y más funciones que cron (vixie-cron) y también estable. Solía ​​hacer cosas estúpidas como tener alrededor de 60 secuencias de comandos PHP ejecutando en una máquina en una configuración muy estúpida y todavía hizo su trabajo!

El trabajo de Crontab se puede utilizar para progtwigr un trabajo en minutos / horas / días, pero no en segundos. La alternativa :

Crea una secuencia de comandos para ejecutar cada 30 segundos:

 #!/bin/bash # 30sec.sh for COUNT in `seq 29` ; do cp /application/tmp/* /home/test sleep 30 done 

Utilice crontab -e y un crontab para ejecutar este script:

 * * * * * /home/test/30sec.sh > /dev/null 

Gracias por todas las buenas respuestas. Para simplificar, me gustó la solución mixta, con el control en crontab y la división de tiempo en el script. Así que esto es lo que hice para ejecutar un script cada 20 segundos (tres veces por minuto). Línea Crontab:

  * * * * 1-6 ./a/b/checkAgendaScript >> /home/a/b/cronlogs/checkAgenda.log 

Guión:

 cd /home/a/b/checkAgenda java -jar checkAgenda.jar sleep 20 java -jar checkAgenda.jar sleep 20 java -jar checkAgenda.jar 

Acabo de hacer una tarea similar y uso el siguiente enfoque:

 nohup watch -n30 "kill -3 NODE_PID" & 

Necesitaba tener un kill de periodic -3 (para obtener el seguimiento de la stack de un progtwig) cada 30 segundos durante varias horas.

 nohup ... & 

Esto está aquí para asegurarme de que no pierdo la ejecución del reloj si pierdo el caparazón (problema de red, locking de ventanas, etc.)

escribir una secuencia de comandos de shell crear archivo .sh

nano every30second.sh

y escritura script

 #!/bin/bash For (( i=1; i < = 2; i++ )) do write Command here sleep 30 done 

luego configure cron para este script crontab -e

(* * * * * /home/username/every30second.sh)

este archivo cron llamado .sh en cada 1 minuto y en el comando del archivo .sh se ejecuta 2 veces en 1 minuto

si quiere ejecutar script durante 5 segundos, reemplace 30 por 5 y cambie por un bucle como este: For (( i=1; i < = 12; i++ ))

cuando selecciona por segundo, calcule 60 / segundo y escriba For loop

Ejecutar en un bucle de shell, por ejemplo:

 #!/bin/sh counter=1 while true ; do echo $counter counter=$((counter+1)) if [[ "$counter" -eq 60 ]]; then counter=0 fi wget -q http://localhost/tool/heartbeat/ -O - > /dev/null 2>&1 & sleep 1 done