Comment exécuter des scripts toutes les 5 secondes?
66
J'ai un script qui doit être exécuté toutes les cinq secondes. Je sais que vous cronpouvez effectuer des tâches à la minute près, mais existe-t-il un moyen d'exécuter quelque chose toutes les secondes?
Quel problème essayez-vous de résoudre? Êtes-vous sûr que cron est la bonne solution?
andol
1
Je sais que cron n'est pas la bonne solution. Je disais que ce n'était pas dans la question. Lisez s'il vous plaît. J'essaie de faire exécuter un script toutes les 5 secondes.
myusuf3
2
Désolé, je suppose que la question est un peu fausse. Pourtant, vous vous demandez toujours si vous essayez de résoudre le bon problème.
andol
Pour les personnes qui viennent ici cherchent comment faire quelque chose toutes les 5 secondes. Je vous recommande vivement d’explorer comment programmer en temps réel avec des outils tels que socket.io, par exemple.
Brandon Bertelsen
Avez-vous découvert la commande bash sleep? sleep 5fait une pause (peut-être dans une boucle) pendant 5 secondes) ...?
SDsolar
Réponses:
64
Cron ne permet qu'une minute au minimum. Ce que vous pouvez faire est d'écrire un script shell avec une boucle infinie qui exécute votre tâche, puis dort pendant 5 secondes. Ainsi, votre tâche sera exécutée plus ou moins toutes les 5 secondes, en fonction de la durée de la tâche.
#!/bin/bashwhile true;do# Do something
sleep 5;done
Vous pouvez créer un my-task.shfichier avec le contenu ci-dessus et l'exécuter avec sh my-task.sh. Vous pouvez éventuellement le configurer avec supervisorun service afin qu'il démarre au démarrage du système, etc.
On dirait vraiment que vous faites quelque chose que vous ne devriez probablement pas faire cependant. Cela ne va pas .
On peut avoir besoin d’un cron lancé toutes les 5 secondes, voire moins, pour être utilisé dans les scrapers basés sur PHP.
Ravish Kumar
Se sent vraiment mal. Si vous l'incluez dans un travail cron, vos tâches se chevaucheront toutes les minutes. Après une heure, 60 travaux démarreront toutes les 5 secondes. Si vous n'incluez pas dans un travail cron, eh bien, vous ne pourrez peut-être pas savoir comment l'arrêter, ni même savoir qu'il existe.
SeF
35
Vous pouvez avoir un cronjob qui lance un script chaque minute et qui démarre ainsi 12 processus en arrière-plan:
Cela m’est bien venu lorsque j’ai créé un script qui vérifie de manière répétée le /mediarépertoire d’un lecteur que je connecte à USB pour des sauvegardes automatiques ...
VF1
32
What on EARTH- statistiques, ramassage des ordures, synchronisation de fichiers, statut en ligne, vous le nommez.
ruX
3
Référencement d'une API externe pour des données en temps quasi réel. Exécuter une demande toutes les 5 secondes est BEAUCOUP mieux que de le faire à chaque vue de page.
Sergey Kudriavtsev
1
Et si crontab exécutait le fichier dostuff.sh deux fois? Par exemple, à la 55e seconde, le script est exécuté mais n'a pas encore fini, mais le cron appelle le script à nouveau, que va-t-il se passer?
TomSawyer
2
C'EST MAUVAIS! Il exécute potentiellement le script plusieurs fois à la fois (si cela prend plus de 5 secondes), ce qui peut conduire à une situation de concurrence critique dans tous les fichiers (même temporaires) auxquels vous accédez. NE PAS FAIRE si faire la même chose deux fois en même temps peut causer un problème! (Et ce sera généralement le cas!)
Nonny Moose
27
Il suffit d'utiliser une boucle:
while true ;do./your-script & sleep 5;done
Cela lancera votre script en tant que tâche en arrière-plan, dormira pendant 5 secondes, puis effectuera une nouvelle boucle. Vous pouvez utiliser Ctrl-C pour l’abandonner, ou utiliser toute autre condition à la place de true, par exemple, ! test -f /tmp/stop-my-scriptne boucler que lorsque le fichier /tmp/stop-my-scriptn’existe pas.
Si j'inclus l'esperluette, ça dit bash: syntax error near unexpected token ';', alors je l'ai sorti. J'ai bash 4.3.11. Ma commande s'exécute rapidement, donc ça va si elle s'exécute au premier plan.
Tyler Collier
1
@TylerCollier Si vous aviez besoin ./your-scriptde courir en arrière-plan (pendant le sommeil de 5 secondes), vous pouvez garder &mais laisser tomber le fichier ;. Comme il &sert à séparer les commandes, il est inutile (et apparemment non autorisé) de les suivre ;après sur la même ligne. Une autre méthode consiste à écrire la boucle sur plusieurs lignes (avec un saut de ligne après &et, éventuellement, des sauts de ligne après doet avant done). Puisque l' ;après &semble être une faute de frappe, je l'ai enlevée. blueyed: S'il vous plaît n'hésitez pas à mettre le ;dos si vous le voulez vraiment; si c'est le cas, je suggère également d'ajouter une explication.
Eliah Kagan
@EliahKagan FWIW, cela fonctionne sur Zsh (pas d'erreur de syntaxe), mais ce n'est pas vraiment nécessaire. Merci pour l'édition!
blueyed
10
Vous pouvez utiliser le paquet GNU mcron , une alternative "Vixie cron".
"Peut facilement permettre de spécifier des points de temps plus fins, c'est-à-dire des secondes. En principe, cela pourrait être étendu à des microsecondes, mais cela n'est pas implémenté."
Il semble que Quartz n'est pas une source ouverte. Est-ce correct?
txwikinger
Il a une version open source. Il n'a pas de page mais allez simplement à la page de téléchargement. Vous n'êtes pas obligé de remplir le formulaire, il vous suffit de cliquer pour m'emmener au téléchargement.
Utilisez cacti pour surveiller le routeur et le commutateur, mais Cron ne permet qu'une minute au minimum. Par conséquent, si un port / périphérique est arrêté, aucun avertissement n'est émis avant deux minutes.
Je recommande de modifier cette réponse pour la développer avec des détails spécifiques sur la façon de procéder. (Voir aussi Comment puis-je écrire une bonne réponse? Pour des conseils généraux sur les types de réponses considérés comme les plus utiles sur Ask Ubuntu.)
David Foerster
2
Vous pouvez utiliser une minuterie SystemD, qui déclenchera un service - que vous auriez configuré pour faire ce que vous voulez - toutes les 5 secondes.
Supposons que votre unité de service soit appelée mystuff.serviceet qu'elle soit installée dans /etc/systemd/system(consultez les services utilisateur SystemD si vous souhaitez remplacer la crontab d'un utilisateur), vous pouvez alors écrire une unité de minuterie pour exécuter le service au démarrage, puis toutes les 5 secondes, comme suit:
C'est la meilleure solution, le seul inconvénient est que cron est beaucoup plus facile à visualiser et à configurer. SystemD est une douleur et il commence par sa structure de répertoires. Toujours le meilleur pour un intervalle de 5 secondes
John
L'extrait ci-dessus ne serait-il pas placé dans /etc/systemd/system/mystuff.timer au lieu de mystuff.service?
Merci ... content de savoir que je ne suis pas fou pendant mon apprentissage de systemd :)
Brooks
1
J'ai fait ce genre de chose avec beaucoup de succès (et le résultat final dure plusieurs semaines à la fois, jusqu'à ce que la machine soit redémarrée). En ce qui concerne ce que je faisais actuellement, mettre à jour les informations et les mettre en cache - mises à jour toutes les 10 secondes.
#!/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
Le 'exec $ 0' redémarre le script, mais remplace le script en cours d'exécution. Il peut être démarré initialement avec une ligne '@reboot' crontab.
sleep 5
fait une pause (peut-être dans une boucle) pendant 5 secondes) ...?Réponses:
Cron ne permet qu'une minute au minimum. Ce que vous pouvez faire est d'écrire un script shell avec une boucle infinie qui exécute votre tâche, puis dort pendant 5 secondes. Ainsi, votre tâche sera exécutée plus ou moins toutes les 5 secondes, en fonction de la durée de la tâche.
Vous pouvez créer un
my-task.sh
fichier avec le contenu ci-dessus et l'exécuter avecsh my-task.sh
. Vous pouvez éventuellement le configurer avecsupervisor
un service afin qu'il démarre au démarrage du système, etc.On dirait vraiment que vous faites quelque chose que vous ne devriez probablement pas faire cependant. Cela ne va pas .
la source
Vous pouvez avoir un
cron
job qui lance un script chaque minute et qui démarre ainsi 12 processus en arrière-plan:dostuff.sh
:Ma question, cependant, est la suivante: que pouvez-vous faire sur la Terre et qui doit être exécuté toutes les 5 secondes?
la source
/media
répertoire d’un lecteur que je connecte à USB pour des sauvegardes automatiques ...What on EARTH
- statistiques, ramassage des ordures, synchronisation de fichiers, statut en ligne, vous le nommez.Il suffit d'utiliser une boucle:
Cela lancera votre script en tant que tâche en arrière-plan, dormira pendant 5 secondes, puis effectuera une nouvelle boucle. Vous pouvez utiliser Ctrl-C pour l’abandonner, ou utiliser toute autre condition à la place de
true
, par exemple,! test -f /tmp/stop-my-script
ne boucler que lorsque le fichier/tmp/stop-my-script
n’existe pas.la source
bash: syntax error near unexpected token ';'
, alors je l'ai sorti. J'ai bash 4.3.11. Ma commande s'exécute rapidement, donc ça va si elle s'exécute au premier plan../your-script
de courir en arrière-plan (pendant le sommeil de 5 secondes), vous pouvez garder&
mais laisser tomber le fichier;
. Comme il&
sert à séparer les commandes, il est inutile (et apparemment non autorisé) de les suivre;
après sur la même ligne. Une autre méthode consiste à écrire la boucle sur plusieurs lignes (avec un saut de ligne après&
et, éventuellement, des sauts de ligne aprèsdo
et avantdone
). Puisque l';
après&
semble être une faute de frappe, je l'ai enlevée. blueyed: S'il vous plaît n'hésitez pas à mettre le;
dos si vous le voulez vraiment; si c'est le cas, je suggère également d'ajouter une explication.Vous pouvez utiliser le paquet GNU mcron , une alternative "Vixie cron".
http://www.gnu.org/software/mcron/manual/mcron.html#Top
"Peut facilement permettre de spécifier des points de temps plus fins, c'est-à-dire des secondes. En principe, cela pourrait être étendu à des microsecondes, mais cela n'est pas implémenté."
la source
mcron
nécessitesendmail
d'être installé et activé par défaut. comment le désactiver?La configuration minimale dans cron est de quelques minutes, vous ne pouvez pas la définir pendant 5 secondes. Vous pouvez utiliser Quartz qui permet des secondes. http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html
la source
Utilisez cacti pour surveiller le routeur et le commutateur, mais Cron ne permet qu'une minute au minimum. Par conséquent, si un port / périphérique est arrêté, aucun avertissement n'est émis avant deux minutes.
la source
Vous pouvez utiliser une minuterie SystemD, qui déclenchera un service - que vous auriez configuré pour faire ce que vous voulez - toutes les 5 secondes.
Supposons que votre unité de service soit appelée
mystuff.service
et qu'elle soit installée dans/etc/systemd/system
(consultez les services utilisateur SystemD si vous souhaitez remplacer la crontab d'un utilisateur), vous pouvez alors écrire une unité de minuterie pour exécuter le service au démarrage, puis toutes les 5 secondes, comme suit:/etc/systemd/system/mystuff.timer
Rechargez ensuite la configuration de systemd, activez le programmateur et démarrez-le.
la source
J'ai fait ce genre de chose avec beaucoup de succès (et le résultat final dure plusieurs semaines à la fois, jusqu'à ce que la machine soit redémarrée). En ce qui concerne ce que je faisais actuellement, mettre à jour les informations et les mettre en cache - mises à jour toutes les 10 secondes.
Le 'exec $ 0' redémarre le script, mais remplace le script en cours d'exécution. Il peut être démarré initialement avec une ligne '@reboot' crontab.
la source
while
boucle au lieu de redémarrer le script à plusieurs reprises?