Lancer un cron toutes les 30 secondes

Ok donc j’ai un cron que je dois courir toutes les 30 secondes … voici ce que j’ai ci-dessous

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

Il fonctionne mais est-ce 30 ou 30 secondes … et j’ai lu que cron n’est peut-être pas le meilleur outil à utiliser si je le lance souvent. Y at-il un autre meilleur outil que je peux installer sur Ubuntu 11.04 qui sera une meilleure option ou existe-t-il un moyen de corriger le cron ci-dessus

Vous avez */30 dans le spécificateur de minutes – cela signifie chaque minute mais avec un pas de 30 (en d’autres termes, toutes les demi-heures). Puisque cron ne se résume pas à des résolutions infimes, vous devrez trouver un autre moyen.

Une possibilité, bien que ce soit un peu compliqué, est d’avoir deux tâches, une décalée de 30 secondes:

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

Les deux tâches cron sont exécutées toutes les minutes, mais la seconde attendra une demi-minute avant d’exécuter le “viande” du travail, /path/to/executable .

Vous ne pouvez pas. Cron a une granularité de 60 secondes.

 * * * * * 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 granularité de Cron est en quelques minutes et n’a pas été conçue pour se réveiller toutes les x secondes pour exécuter quelque chose. Exécutez votre tâche répétitive dans une boucle et cela devrait faire ce dont vous avez besoin:

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

Pas besoin de deux entrées cron, vous pouvez le mettre en un avec:

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

donc dans votre cas:

* * * * * /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'\''"

Vous pouvez consulter ma réponse à cette question similaire

Fondamentalement, j’ai inclus un script bash nommé “runEvery.sh” que vous pouvez exécuter avec cron toutes les 1 minute et passer en argument la vraie commande que vous souhaitez exécuter et la fréquence en secondes dans laquelle vous voulez l’exécuter.

quelque chose comme ça

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

Le travail périodique ne peut pas être utilisé pour planifier un travail à intervalles de secondes. c.-à-d. Vous ne pouvez pas planifier une tâche cron pour qu’elle s’exécute toutes les 5 secondes. L’alternative consiste à écrire un script shell qui utilise sleep 5 commande sleep 5 .

Créez un script de shell every-5-seconds.sh en utilisant bash while loop comme indiqué ci-dessous.

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

Maintenant, exécutez ce script shell en arrière-plan en utilisant nohup comme indiqué ci-dessous. Cela continuera à exécuter le script même après votre déconnexion de votre session. Cela exécutera votre script de sauvegarde backup.sh toutes les 5 secondes.

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

Utilisez la montre:

 $ watch --interval .30 script_to_run_every_30_sec.sh 

dans dir /etc/cron.d/

nouveau créer un fichier excute_per_30s

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

courra toutes les 30 secondes

Utilisez fcron ( http://fcron.free.fr/ ) – vous donne la granularité en quelques secondes et mieux et plus de fonctionnalités que cron (vixie-cron) et stable. J’avais l’habitude de faire des choses stupides comme avoir environ 60 scripts PHP exécutés sur une machine dans des parameters très stupides et ça faisait toujours son travail!

Le travail Crontab peut être utilisé pour planifier un travail en minutes / heures / jours, mais pas en secondes. L’alternative :

Créez un script à exécuter toutes les 30 secondes:

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

Utilisez crontab -e et un crontab pour exécuter ce script:

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

Merci pour toutes les bonnes réponses. Pour simplifier, j’ai aimé la solution mixte, avec le contrôle sur crontab et la division du temps sur le script. C’est ce que j’ai fait pour exécuter un script toutes les 20 secondes (trois fois par minute). Ligne Crontab:

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

Scénario:

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

J’ai juste eu une tâche similaire à faire et utiliser l’approche suivante:

 nohup watch -n30 "kill -3 NODE_PID" & 

Je devais avoir un kill -3 périodique (pour obtenir la trace de la stack d’un programme) toutes les 30 secondes pendant plusieurs heures.

 nohup ... & 

C’est ici pour être sûr que je ne perds pas l’exécution de watch si je perds le shell (problème réseau, crash de Windows etc …)

écrire un script shell créer un fichier .sh

nano every30second.sh

et écrire un script

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

puis définissez cron pour ce script crontab -e

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

ce fichier cron call .sh toutes les 1 min & dans la commande de fichier .sh est exécuté 2 fois en 1 min

si vous voulez exécuter le script pendant 5 secondes, remplacez 30 par 5 et changez pour loop comme ceci: For (( i=1; i <= 12; i++ ))

lorsque vous sélectionnez pour une seconde, calculez ensuite 60 / votre seconde et écrivez dans For loop

Exécuter dans une boucle shell, exemple:

 #!/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