Exécution d'un cron toutes les 30 secondes
Ok donc j'ai un cron que je dois exécuter 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 minutes ou 30 secondes...et aussi j'ai lu que cron pourrait ne pas être le meilleur outil à utiliser si je l'exécute aussi souvent. Un meilleur outil que je peux installer sur ubuntu 11.04 qui sera une meilleure option ou est-il un moyen de corriger le ci-dessus cron
14 réponses
Vous avez */30
dans le spécificateur minutes - cela signifie chaque minute mais avec un pas de 30 (en d'autres termes, toutes les demi-heures). Puisque cron
ne descend pas aux résolutions de sous-minute, vous devrez trouver un autre moyen.
Une possibilité, bien que ce soit un peu un kludge, est d'avoir deux emplois, un décalage de 30 secondes:
* * * * * /path/to/executable param1 param2
* * * * * ( sleep 30 ; /path/to/executable param1 param2 )
Les deux travauxcron s'exécutent toutes les minutes mais ce dernier attendra une demi-minute avant d'exécuter la "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 minutes et n'était pas conçu 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 il 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 semblable
Fondamentalement, j'y ai inclus un script bash nommé "runEvery.sh" que vous pouvez exécuter avec cron toutes les 1 minute et passer comme arguments la commande réelle 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 Cron ne peut pas être utilisé pour planifier un travail en secondes d'intervalle. c'est-à-dire que vous ne pouvez pas planifier une tâche cron à exécuter toutes les 5 secondes. L'alternative est d'écrire un script shell qui utilise sleep 5
commande.
Créer un script shell every-5-seconds.sh en utilisant bash while boucle 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 la déconnexion de votre session. Cela exécutera votre backup.sh script shell toutes les 5 secondes.
$ nohup ./every-5-seconds.sh &
Utiliser montre:
$ watch --interval .30 script_to_run_every_30_sec.sh
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
Exécutera cron toutes les 30 secondes
Utiliser fcron ( http://fcron.free.fr/) - Vous donne granularité en quelques secondes et beaucoup mieux et plus riche en fonctionnalités que cron (vixie-cron) et stable aussi. J'avais l'habitude de faire des choses stupides comme avoir environ 60 scripts php en cours d'exécution sur une machine dans des paramètres très stupides et il a toujours fait 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 une 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 donc 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
Script:
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" &
J'avais besoin d'avoir un kill -3 périodique (pour obtenir la trace de pile 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 de 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
Ensuite, définissez cron pour ce script crontab -e
(* * * * * /home/username/every30second.sh)
Ce fichier cron call. sh toutes les 1 min et dans la commande. sh file 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 la boucle comme ceci: For (( i=1; i <= 12; i++ ))
Lorsque vous sélectionnez pour une seconde, calculez 60 / votre seconde et écrivez pour boucle
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