80 votes

Comment exécuter 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, mais existe-t-il un moyen d'exécuter quelque chose à chaque seconde ?

73voto

Stewart Points 925

Cron ne permet qu'un minimum d'une minute. Ce que vous pourrait est d'écrire un Shell Shell avec une boucle infinie qui exécute votre tâche, puis dort pendant 5 secondes. De cette façon, votre tâche serait exécutée plus ou moins toutes les 5 secondes, en fonction du temps que prend la tâche elle-même.

#!/bin/bash

while true; do
  # Do something
  sleep 5;
done

Vous pouvez créer un my-task.sh avec le contenu ci-dessus et l'exécuter avec sh my-task.sh . En option, vous pouvez le configurer avec supervisor comme un service pour qu'il démarre au démarrage du système, etc.

On dirait vraiment que tu fais quelque chose que tu ne devrais probablement pas faire. Cela semble mauvais .

43voto

Vous pourriez avoir un cron job kick-off un script chaque minute qui démarre 12 processus en arrière-plan ainsi :

* * * * * ~/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 Qu'est-ce qui se passe sur Terre ? que vous pourriez faire qui doit être exécuté toutes les 5 secondes ?

29voto

Arnold Zokas Points 4086

Utilisez simplement une boucle :

while true ; do ./your-script & sleep 5; done

Ceci lancera votre-script en tant que tâche d'arrière-plan, dormira pendant 5 secondes, puis bouclera à nouveau. Vous pouvez utiliser Ctrl-C pour l'interrompre, ou utiliser toute autre condition à la place de true par exemple ! test -f /tmp/stop-my-script pour ne boucler que lorsque le fichier /tmp/stop-my-script n'existe pas.

12voto

David Points 263

Vous pouvez utiliser le paquetage GNU mcron une alternative à "Vixie cron".

http://www.gnu.org/software/mcron/manual/mcron.html#Top

"Il est facile de spécifier des points de temps plus fins, par exemple des secondes. En principe, cela pourrait être étendu aux microsecondes, mais cela n'est pas implémenté."

5voto

FooLman Points 175

Vous pourriez utiliser une unité de temporisation SystemD, qui déclenchera un service - que vous aurez configuré pour faire ce que vous voulez - toutes les 5 secondes.

Supposons que votre unité de service s'appelle mystuff.service et est installé dans /etc/systemd/system (voir Services aux utilisateurs de SystemD si vous voulez remplacer la crontab d'un utilisateur), alors vous pouvez écrire une unité de temporisation pour exécuter le service au démarrage et ensuite 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

Ensuite, rechargez la configuration systemd, activez l'unité de temporisation et démarrez-la.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X