web-dev-qa-db-fra.com

Puis-je exécuter une tâche cron plus fréquemment que toutes les minutes?

Est-il possible d'exécuter une tâche cron toutes les 30 secondes sans commande de mise en veille?

48
user15336

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

38

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

14
Balázs Pozsár
* * * * * /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.

13
ghoti

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.

8
thatjuan

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.

2
mdpc

ma solution la plus simple et préférée pour cette tâche:

entrée cron:
* * * * * flock -w0 /path/to/script /path/to/script

scénario:
while true;do echo doing something; sleep 10s;done

alternative paresseuse: :)

* * * * * 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

avantages

  • l'utilisation de la commande 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.
  • Les commandes flock et watch sont disponibles sur la plupart des installations Linux

les inconvénients

  • l'arrêt de ce type de "Service" nécessite deux étapes
    • commenter l'entrée cron
    • tuer le script ou la commande watch
1
asvany

Une solution, si c'est pour votre propre script ou si vous pouvez envelopper:

  1. Obtenez et rappelez-vous l'heure de début.
  2. Si un fichier de verrouillage, que vous toucherez plus tard, est présent et que le script n'a pas été exécuté pendant 60 secondes, attendez une seconde et vérifiez à nouveau. (par exemple pendant/sommeil) *
  3. Si le fichier de verrouillage est toujours présent après 60 secondes, quittez avec un avertissement de verrouillage périmé.
  4. Appuyez sur verrouiller le fichier.
  5. Bien que le script n'ait pas été exécuté pendant 60 secondes, bouclez votre tâche réelle avec la durée de sommeil souhaitée.
  6. Supprimer le fichier de verrouillage.
  7. Ajouter le plus finement cron.
  8. Bob est ton oncle.

Moins de casse-tête que de créer et de surveiller un démon.

* Si vous utilisez PHP, n'oubliez pas clearstatcache ().

0
Someone