J'ai une tâche qui doit être effectuée sur le calendrier de mon projet (3 semaines).
Je peux configurer cron pour le faire chaque semaine, ou (par exemple) la 3e semaine de chaque mois - mais je ne trouve pas de moyen de le faire toutes les trois semaines.
Je pourrais pirater le script pour créer des fichiers temporaires (ou similaire) afin qu'il puisse fonctionner c'était la troisième fois qu'il était exécuté - mais cette solution sent.
Peut-il être fait de manière propre?
Réponses:
Le fichier crontab vous permet uniquement de spécifier:
Il n'est donc pas possible de spécifier les semaines à appliquer.
L'écriture d'un script wrapper peut être la meilleure option.
Vous pouvez obtenir le numéro de semaine dans un shell-script en utilisant
ou
selon que vous souhaitez que vos semaines commencent le dimanche ou le lundi.
Vous pouvez donc utiliser
Et le chèque serait de 0 dans les 1ère, 4ème, 7ème, ... semaines de l'année.
la source
Grâce aux réponses précédentes, les options de l'époque ont été pointées pour dater -e ou formater en% s
Bien qu'un peu douloureux
((date +%s) / 86400)
donne des jours de l'époque.En s'appuyant sur le travail hebdomadaire exécuté en même temps, il est alors facile de comparer cela à un jour spécifique d'une période de 3 semaines (
$epoch_day%21 == 13
par exemple)Dans mon cas, c'est très bien, car c'est une tâche unique. Si elle est manquée le jour particulier, il n'est pas nécessaire de courir à la prochaine occasion.
la source
Si vous pouvez enregistrer un fichier d'horodatage entre les exécutions, vous pouvez vérifier sa date au lieu de vous fier uniquement à la date actuelle.
Si votre commande find prend en charge des valeurs fractionnaires pour
-mtime
(ou a-mmin
) ( GNU find a les deux , POSIX ne semble pas en avoir besoin non plus ), vous pouvez `` étrangler '' les tâches cron avec find et touch .Ou, si vous avez une commande stat qui prend en charge l'affichage des dates de fichier en «secondes depuis l'époque» (par exemple, stat de Gnu coreutils , également d'autres implémentations), vous pouvez faire votre propre comparaison en utilisant date , stat et les opérateurs de comparaison du shell (avec avec touche pour mettre à jour un fichier d'horodatage). Vous pouvez également être en mesure d'utiliser ls au lieu de stat s'il peut effectuer le formatage (par exemple, ls de GNU fileutils ).
Ci-dessous se trouve un programme Perl (je l'ai appelé
n-hours-ago
) qui met à jour un fichier d'horodatage et se termine avec succès si l'horodatage d'origine était assez ancien. Son texte d'utilisation montre comment l'utiliser dans une entrée crontab pour limiter une tâche cron. Il décrit également les ajustements pour «l'heure d'été» et comment gérer les horodatages «tardifs» des exécutions précédentes.la source