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?
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 .
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?
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.
Vous pouvez utiliser le package 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é."
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
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.
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.