Comment exécuter des scripts toutes les 5 secondes?

58

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

    
posée myusuf3 04.08.2010 - 21:03
la source

8 réponses

60

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 qui 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 elle-même.

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

Cela ressemble vraiment à quelque chose que vous ne devriez probablement pas faire. Cela semble faux .

    
réponse donnée Tommy Brunn 04.08.2010 - 21:07
la source
30

Vous pourriez avoir un cron job qui lance un script toutes les minutes qui démarre ainsi 12 processus en arrière-plan:

* * * * * ~/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) &

Cependant, ma question est la suivante: Que pouvez-vous faire sur EARTH et qui doit être exécuté toutes les 5 secondes?

    
réponse donnée warren 04.08.2010 - 21:24
la source
27

Utilisez simplement une boucle:

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

Ceci 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 true , par exemple. ! test -f /tmp/stop-my-script ne boucle que lorsque le fichier /tmp/stop-my-script n’existe pas.

    
réponse donnée blueyed 04.08.2010 - 22:51
la source
10

Vous pouvez utiliser le package GNU mcron , une alternative "Vixie cron".

lien

"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é."

    
réponse donnée David 13.05.2014 - 17:24
la source
2

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. lien

    
réponse donnée Cody Harlow 04.08.2010 - 21:07
la source
2

Utilisez cacti pour surveiller le routeur et le commutateur, mais Cron ne permet qu'une minute au minimum.  si un port / périphérique est hors service, aucun avertissement n’est émis avant deux minutes.

    
réponse donnée qttty 26.11.2012 - 03:25
la source
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

'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.

    
réponse donnée Alister Bulman 04.08.2010 - 21:28
la source
0

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 (consultez Services utilisateur SystemD si vous voulez remplacer la crontab d’un utilisateur), vous pouvez écrire une unité de minuterie pour exécuter le service au démarrage, puis toutes les 5 secondes, comme suit:

/etc/systemd/system/mystuff.service

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

Rechargez ensuite la configuration de systemd, activez l'unité de minuterie et démarrez-la.

    
réponse donnée 30.11.2018 - 14:29
la source

Lire d'autres questions sur les étiquettes