Est-il possible d'exécuter une tâche cron toutes les 30 secondes sans commande de veille?
Est-il possible d'exécuter une tâche cron toutes les 30 secondes sans commande de veille?
Réponses:
Si votre tâche doit être exécutée aussi souvent, cron est le mauvais outil. Outre le fait qu'il ne lancera tout simplement pas des travaux aussi souvent, vous risquez également 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émoniser et l'exécuter de manière persistante, puis lancez-la à partir de cron si nécessaire (tout en vous assurant qu'elle ne se relancera pas si elle est déjà en cours d'exécution).
run-one
assurer qu'un programme / même un script PHP ne démarre pas une instance en double. sudo apt-get install run-one
et appelez-le parrun-one <normal command>
Candidat pour l' utilisation la plus créative d'une commande Linux:
nohup watch -n 30 --precise yourprog >/dev/null &
Si yourprog
consiste en:
date +%M.%S.%N >> yourprog.out
alors 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
- Ceci empêche la commande qui la suit, watch
dans ce cas, de sortir lorsque le terminal quitte.watch
- Ce programme exécute une commande à plusieurs reprises. Normalement, le premier écran de sortie de la commande est affiché à chaque watch
exécution de 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 un intervalle de secondes. Avec elle, chaque début de commande commence sur l’intervalle, si possible. Si cette option n'était pas spécifiée dans l'exemple, les heures seraient plus longues et plus longues de plus de 30 secondes à chaque fois en raison du temps nécessaire au lancement et à l'exécution de la commande ( yourprog
).yourprog
- Le programme ou la ligne de commande 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), vous devrez la citer.>/dev/null
- L'supérieur à redirige la sortie de la commande en cours d' exécution par watch
un fichier, /dev/null
. Ce fichier supprime toutes les données écrites. Cela évite que la sortie ne soit écrite à l'écran ou, étant donné qu'elle nohup
est utilisée, elle empêche l'envoi de la sortie dans un fichier appelé nohup.out
.&
- La watch
commande 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 la sortie et l' &
opérateur de contrôle en arrière - plan ne sont pas spécifiques à watch
.
Voici une explication de l'exemple de yourprog
script:
date
- Affiche la date et / ou l'heure actuelles. Il peut aussi les définir.+%M.%S.%N
- Ceci spécifie le format de sortie date
à utiliser. %M
est la minute actuelle, %S
la seconde actuelle et %N
la nanoseconde actuelle.>> yourprog.out
- Ceci redirige la sortie de la date
commande vers un fichier appelé yourprog.out
. Le double supérieur à que entraîne l'ajout de la sortie au fichier à chaque appel plutôt que le contenu précédent étant écrasé.Modifier :
Une autre chose qui pourrait être maltraitée (ou peut-être une utilisation légitime) est la minuterie système.
Voir systemd / Timers comme un remplacement cron et les timers Cron vs systemd .
Je vais essayer de poster un exemple bientôt.
&
provoque l'exécution de la commande en arrière-plan, rendant immédiatement le contrôle à l'invite de commande. L'utilisation de la nohup
commande force le processus en arrière-plan (dans ce cas watch
) à ignorer le signal de raccrochage envoyé lors de la fermeture du shell, par exemple lorsque vous fermez le terminal. ...
>/dev/null
entraîne l'élimination de la sortie et empêche la création d'un nohup.out
fichier qui serait autrement créé lorsque la sortie standard est un terminal.
sleep
, vous devez écrire une boucle pour que le processus se répète (le watch
répète pour vous, comme vous le feriez cron
). Vous auriez encore besoin nohup
et &
. Un problème supplémentaire sleep
serait la dérive temporelle. L' --precise
option watch
évite cela. Sans lui ou lors de l'utilisation sleep
dans une boucle, l'intervalle de temps a le temps nécessaire pour que les commandes ou le script soient exécutés, afin que chaque exécution soit postérieure et ultérieure à ...
Cron est conçu pour se réveiller à chaque minute, il est donc impossible de le faire sans piratage, par exemple en dormant 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 ne laisse que très peu d’occasions d’échec. Recherchez donc sur Google une meilleure solution applicable à votre environnement.
without a sleep command
Vous pouvez le faire avec un logiciel tiers.
Une option qui a bien fonctionné pour moi est fréquente-cron
Il permet une précision en millisecondes et vous offre la possibilité de différer la prochaine exécution jusqu'à la fin de l'exécution en cours.
J'aurais quelques préoccupations:
(1) Parfois, un système est occupé et ne peut pas démarrer les choses exactement au bout de 30 secondes. Il est alors possible qu’au même moment que vous exécutiez un travail, un autre travail apparaisse et que vous ayez alors 2 travaux (ou plus) faisant la même chose. chose. Selon le script, il peut y avoir une interférence significative ici. Ainsi, le codage dans un tel script devrait contenir du code afin de s’assurer qu’une seule instance du script donné est exécutée en même temps.
(2) Le script peut avoir beaucoup de temps système et consommer plus de ressources système que vous ne le souhaitez. Cela est vrai si vous êtes en compétition avec beaucoup d'autres activités du système.
Ainsi, comme l'a indiqué une personne, dans ce cas, j’envisagerais sérieusement de mettre en place un démon fonctionnant avec des processus supplémentaires afin de s’assurer qu’il continue de fonctionner s’il revêt une importance cruciale 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
commande é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 les watch
commandes sont disponibles sur la plupart des installations Linuxwatch
commandeUne solution, si c'est pour votre propre script ou si vous pouvez l'envelopper:
Moins de maux de tête que de construire et de surveiller un démon.
* Si vous utilisez PHP, rappelez-vous clearstatcache ().