Est-il possible d'exécuter une tâche cron toutes les 30 secondes sans commande de mise en veille?
Si votre tâche doit être exécutée fréquemment, cron n'est pas le bon outil. Outre le fait qu'il ne lancera tout simplement pas les travaux aussi fréquemment, vous risquez également de rencontrer de graves problèmes si l'exécution du travail prend plus de temps que l'intervalle entre les lancements. Réécrivez votre tâche pour la démonifier et l'exécuter de manière persistante, puis lancez-la à partir de cron si nécessaire (tout en vous assurant qu'elle ne sera pas relancée si elle est déjà en cours d'exécution).
Candidat au le plus créatif abus d'une commande Linux:
Nohup watch -n 30 --precise yourprog >/dev/null &
Si yourprog
comprend:
date +%M.%S.%N >> yourprog.out
puis yourprog.out
pourrait ressembler à:
50.51.857291267
51.21.840818353
51.51.840910204
52.21.840513307
52.51.842455224
53.21.841195858
53.51.841407587
54.21.840629676
indiquant un assez bon niveau de précision.
Voici une explication des parties de la commande:
Nohup
- Cela empêche la commande qui la suit, watch
dans ce cas, de quitter lorsque le terminal se ferme.watch
- Ce programme exécute une commande à plusieurs reprises. Normalement, le premier écran de sortie de la commande s'affiche à chaque fois que watch
exécute la commande.-n 30
- L'intervalle auquel exécuter la commande. Dans ce cas, c'est toutes les trente secondes.--precise
- Sans cette option, watch
exécute la commande après intervalle secondes. Avec cela, chaque démarrage de la commande commence sur l'intervalle si possible. Si cette option n'était pas spécifiée dans l'exemple, les heures seraient de plus en plus tardives de plus de 30 secondes à chaque fois en raison du temps nécessaire pour lancer et exécuter la commande (yourprog
).yourprog
- Le programme ou la ligne de commande pour watch
à exécuter. Si la ligne de commande contient des caractères spéciaux pour le shell (par exemple un espace ou un point-virgule), il devra être cité.>/dev/null
- Le plus grand que redirige la sortie de la commande exécutée par watch
vers un fichier, /dev/null
. Ce fichier supprime toutes les données qui y sont écrites. Cela empêche la sortie d'être écrite à l'écran ou, puisque Nohup
est utilisé, cela empêche la sortie d'être envoyée vers un fichier appelé Nohup.out
.&
- La commande watch
est exécutée en arrière-plan et le contrôle est renvoyé au terminal ou au processus parent.Notez que Nohup
, la redirection de sortie et le &
Les opérateurs de contrôle en arrière-plan ne sont pas spécifiques à watch
.
Voici une explication de l'exemple de script yourprog
:
date
- Affiche la date et/ou l'heure actuelles. Il peut également les définir.+%M.%S.%N
- Ceci spécifie le format de sortie pour date
à utiliser. %M
est la minute actuelle, %S
est la seconde actuelle et %N
est la nanoseconde actuelle.>> yourprog.out
- Ceci redirige la sortie de la commande date
vers un fichier appelé yourprog.out
. Le double supérieur à fait que la sortie est ajoutée au fichier à chaque appel plutôt que le contenu précédent n'est écrasé.Modifier :
Une autre chose qui pourrait être abusée (ou peut-être une utilisation légitime) est peut-être les temporisateurs systemd.
Voir systemd/Timers en remplacement de cron et Cron vs timers systemd .
Je vais essayer de poster un exemple bientôt.
Cron est conçu pour se réveiller à chaque minute, il n'est donc pas possible de le faire sans un piratage, par exemple dormir comme vous l'avez mentionné.
* * * * * /path/to/program
* * * * * sleep 30; /path/to/program
N'oubliez pas d'écrire quelque chose dans votre programme pour qu'il se termine si une instance précédente est déjà en cours d'exécution.
#!/bin/sh
if ln -s "pid=$$" /var/pid/myscript.pid; then
trap "rm /var/pid/myscript.pid" 0 1 2 3 15
else
echo "Already running, or stale lockfile." >&2
exit 1
fi
Bien sûr, cela laisse encore une très petite chance d'échec, alors recherchez sur google une meilleure solution applicable à votre environnement.
Vous pouvez le faire avec un logiciel tiers.
Une option qui a bien fonctionné pour moi est fréquent-cron
Il permet une précision en millisecondes et vous donne la possibilité de reporter la prochaine exécution jusqu'à la fin de celle en cours.
J'aurais quelques inquiétudes:
(1) Parfois, un système est occupé et ne peut pas démarrer les choses exactement au point 30 secondes, il est alors possible qu'en même temps que vous exécutez un travail, un autre travail apparaisse et que vous ayez 2 (ou plus) travaux faisant de même chose. Selon le script, il peut y avoir des interférences importantes ici. Ainsi, le codage dans un tel script doit contenir du code pour garantir qu'une seule instance du script donné s'exécute en même temps.
(2) Le script pourrait avoir beaucoup de surcharge et consommer plus de ressources système que vous ne le souhaiteriez. Cela est vrai si vous êtes en concurrence avec de nombreuses autres activités du système.
Ainsi, comme l'a dit une affiche, dans ce cas, j'envisagerais sérieusement de mettre en place un démon fonctionnant avec des processus supplémentaires pour s'assurer qu'il continue de fonctionner s'il est d'une importance critique pour vos opérations.
entrée cron:* * * * * flock -w0 /path/to/script /path/to/script
scénario:while true;do echo doing something; sleep 10s;done
* * * * * flock -w0 /path/to/log watch -n 10 echo doing >> /path/to/log
ou
* * * * * flock -w0 /path/to/log watch -n 10 /path/to/script
flock
évite d'exécuter le script par plusieurs instances en même temps. Cela peut être très important dans la plupart des cas.flock
et watch
sont disponibles sur la plupart des installations Linuxwatch
Une solution, si c'est pour votre propre script ou si vous pouvez envelopper:
Moins de casse-tête que de créer et de surveiller un démon.
* Si vous utilisez PHP, n'oubliez pas clearstatcache ().