web-dev-qa-db-fra.com

Comment exécuter des scripts toutes les 5 secondes?

J'ai un script qui doit être exécuté toutes les cinq secondes. Je sais que cron peut effectuer des tâches à la minute près, mais existe-t-il un moyen d'exécuter une tâche à la seconde?

61
myusuf3

Cron ne permet qu'une minute au minimum. Ce que vous pouvez faire, c’est écrire un script Shell avec une boucle infinie qui exécute votre tâche, puis se met en veille 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/bash

while true; do
  # Do something
  sleep 5;
done

Vous pouvez créer un fichier my-task.sh avec le contenu ci-dessus et l'exécuter avec sh my-task.sh. Vous pouvez éventuellement le configurer avec supervisor en tant que 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 semble faux .

61
Tommy Brunn

Vous pouvez avoir un travail cron lancer un script toutes les minutes pour démarrer 12 processus en arrière-plan de la manière suivante:

* * * * * ~/dostuff.sh

dostuff.sh:

(sleep 5 && /path/to/task) &
(sleep 10 && /path/to/task) &
(sleep 15 && /path/to/task) &
(sleep 20 && /path/to/task) &
(sleep 25 && /path/to/task) &
(sleep 30 && /path/to/task) &
(sleep 35 && /path/to/task) &
(sleep 40 && /path/to/task) &
(sleep 45 && /path/to/task) &
(sleep 50 && /path/to/task) &
(sleep 55 && /path/to/task) &
(sleep 60 && /path/to/task) &

Ma question, cependant, est Que se passe-t-il sur la Terre que pouvez-vous faire et qui doit s'exécuter toutes les 5 secondes?

32
warren

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 au lieu de truename__, par exemple. ! test -f /tmp/stop-my-script uniquement en boucle alors que le fichier /tmp/stop-my-script n'existe pas.

27
blueyed

Vous pouvez utiliser le package 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 ceci n'est pas implémenté."

10
David

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.

2
qttty

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

2
Cody Harlow

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 s'appelle mystuff.service et soit installée dans /etc/systemd/system (extrayez services utilisateur SystemD si vous voulez remplacer la crontab d’un utilisateur), vous pouvez alors écrire une unité de minuterie pour exécuter le service au démarrage et puis toutes les 5 secondes, comme ceci:

/etc/systemd/system/mystuff.timer

[Unit]
Description=my stuff's schedule
[Timer]
OnBootSec=5
OnUnitActiveSec=5
[Install]
WantedBy=timers.target

Rechargez ensuite la configuration de systemd, activez le programmateur et démarrez-le.

2
Guss

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.

1
Alister Bulman