GNU/Linux >> Tutoriels Linux >  >> Linux

Dans Crontab, manière générique de spécifier toutes les n minutes où n> 60

Vous avez juste besoin de faire le calcul vous-même pour trouver les tâches requises pour atteindre votre timing.

0 0-23/7 * * * whatever
30 3-23/7 * * * whatever

Un algorithme simple peut être conclu à partir de ces deux exemples (avec un décalage de 30 minutes) :

  • Ajoutez deux entrées :une avec un décalage de 0 minute et une autre avec un décalage de 30 minutes.
  • Spécifier une largeur de plage d'heures égale à duration * 2 .
  • Spécifiez le décalage horaire :l'un commence par 0 et l'autre commence par la durée après avoir supprimé la partie de 30 minutes.

Si vous réfléchissez davantage, vous pouvez trouver des solutions similaires pour quelque chose comme toutes les 75 minutes.

Modifier :

Cron ne peut pas être utilisé pour tous les types de tâches planifiées. Par exemple, exécuter une tâche une fois par mois le dernier jour du mois. Vous ne pouvez pas simplement le faire avec cron car le dernier jour du mois change d'un mois à l'autre. Pour résoudre ce problème, vous pouvez exécuter une tâche cron dans la plage de valeurs possibles du dernier jour du mois (28-31) et vérifier qu'il s'agit bien du dernier jour ou non dans le script avant d'effectuer la tâche proprement dite.


Mettre le résultat de la commande

date +%s

dans une variable de votre crontab. Quelque chose comme TIME=1497950105. Maintenant, dans votre crontab, vous avez besoin d'une entrée comme

* * * * * /bin/bash -c '[[ $(($(date +\%s)-TIME)) -gt seconds ]] && TIME=$(date +\%s) && whatever'

Où secondes est le nombre de secondes que vous voulez (12600 dans votre cas).

Ou si vous voulez attendre 3 heures et 30 minutes après la fin du programme

* * * * * /bin/bash -c '[[ $(($(date +\%s)-TIME)) -gt seconds ]] && whatever && TIME=$(date +\%s)'

Modifier : J'ai corrigé ma réponse précédente :

  • vous devez échapper le signe % avec \, donc %s devient \%s
  • vous devez faire précéder la commande de /bin/bash -c

Une autre solution (sans utiliser TIME) est :

 * * * * * /bin/bash -c '[[ $((($(date +\%s) / 60) % minutes)) -eq 0 ]] && whatever'

Où minutes est 210 dans votre cas.

Modification 2 :

Comme suggéré par MSalters, il est préférable d'exécuter l'entrée toutes les N minutes, où N est le plus grand commun diviseur entre 60 et votre intervalle de temps en minutes


Dans ce cas, je pense que vous essayez simplement d'utiliser le cron pour faire quelque chose qu'il n'est pas capable de faire par lui-même (à l'exception bien sûr des solutions où cron exécute périodiquement un script d'assistance, auquel cas je dirais que ce n'est pas cron résoudre lui-même le problème).

La solution avec l'intervalle de 3 heures 30 minutes n'est pas tout à fait correcte. Voici la solution proposée :

0 0-23/7 * * * whatever
30 3-23/7 * * * whatever

La raison en est que cron exécutera alors la tâche aux heures 21h00 et 00h00, ce qui correspond à un intervalle de 3 heures au lieu de 3 heures 30 minutes.

Une solution générale pour tous les intervalles de temps devrait pouvoir traiter les cas qui ne se divisent pas uniformément en 24 heures. Bien qu'il ne se divise pas uniformément en 24 heures, il se divise également en une semaine ! La façon la plus simple de penser à cela est de faire deux séries qui se chevauchent de "toutes les 7 heures", comme ceci :

0 0-23/7 * * 1 whatever
0 4-23/7 * * 2 whatever
0 1-23/7 * * 3 whatever
0 5-23/7 * * 4 whatever
0 2-23/7 * * 5 whatever
0 6-23/7 * * 6 whatever
0 3-23/7 * * 7 whatever
30 3-23/7 * * 1 whatever
30 0-23/7 * * 2 whatever
30 4-23/7 * * 3 whatever
30 1-23/7 * * 4 whatever
30 5-23/7 * * 5 whatever
30 2-23/7 * * 6 whatever
30 6-23/7 * * 7 whatever

Quelque chose qui est divisible par une semaine est le mieux que vous puissiez faire, car les mois ne s'alignent pas parfaitement avec les semaines, et c'est la seule façon de faire. Par exemple, un intervalle de précision toutes les 12 minutes est trivial dans une ligne de crontab, mais un intervalle de précision toutes les 11 minutes est impossible, car 10080 n'est pas divisible par 11. (10080 étant le nombre de minutes dans une semaine).

Il serait certainement possible d'écrire un algorithme pour résoudre les cas où cela est possible, mais cela ne vaut clairement pas grand-chose, surtout si l'on considère à quoi ressembleraient réellement les solutions.


Linux
  1. Où est le journal cron/crontab ? / Comment activer le Cron Log ?

  2. Manière de modifier un fichier sur place ?

  3. Avons-nous une annulation sous Linux ?

  4. Comment empêcher un utilisateur non root de créer une entrée crontab

  5. L'utilisateur ne peut pas modifier crontab, erreur :"/tmp/crontab.Lm34gsJV :autorisation refusée"

Comment exécuter une tâche Crontab chaque semaine le dimanche

Pourquoi Linux est-il si mauvais et Windows 11 meilleur à tous points de vue ?

HDDTemp crontab toutes les heures dans le fichier

Exemple Crontab – toutes les 5 minutes

Le moyen le plus simple de localiser un défaut de segmentation

Comment exécuter le travail crontab chaque semaine le dimanche