2009-04-09 4 views

Répondre

0

Exécutez-le sur le 1er, 2ème, 4ème (et peut-être 5ème, cela peut arriver) week-ends.

# m h dom  mon dow command 
    * * 1-20,28-31 * 0  echo #test 

Je ne sais pas si cela se déroulera tous les jours, ou tout simplement le dimanche (jour 0), mais il ne fonctionnera pas sur le 21 au 27 - la troisième semaine. Il peut être assez simple de mettre un chèque dans le script qui va sortir si c'est la troisième semaine (ou ce n'est pas un dimanche).

+0

Cela ne fonctionnera pas réellement (du moins pas avec vixie cron). Cela provoquera l'exécution du script les jours 1-20, 28-31, * et * tous les dimanches. Lorsque dom et dow sont spécifiés, le script est exécuté lorsque l'une ou l'autre condition réussit. –

+0

Je suis corrigé - mais une vérification dans le script pour un 'non-dimanche, donc exit' résoudrait cela. Puis, encore une fois, de même courir tous les dimanches, puis en sortant si c'était le 21-27. –

0

Si vous souhaitez l'exécuter sur un possible samedi, sauf le troisième (essayer # 3):

GREP=/usr/local/bin/grep 
TODAY=/bin/date "+%d" 
THIRD_SAT=/bin/date -v1d -v+1m -v-7d -v-sat "+%d" 
#min hr day month weekday script 
0 0 * *  6  ($THIRD_SAT | $GREP $TODAY) || /bin/echo doit 
+0

Cela ne fonctionnera pas réellement (du moins pas avec vixie cron). Cela provoquera l'exécution du script les jours 1-13, 21-31, * et * tous les samedis. Lorsque le jour du mois et le jour de la semaine sont spécifiés, le script est exécuté lorsqu'une condition réussit. –

+0

Merci d'avoir signalé cela. Je n'avais pas réalisé que les deux dernières colonnes sont ORed au lieu de ANDed. Apprendre quelque chose de nouveau chaque jour! –

0
  1. faire une tâche cron qui exécute un script donné en cas de besoin en ignorant la partie 3ème week-end
  2. faites un travail cron qui s'exécute sur le 21 et un autre sur le 28 pour éteindre le script et revenir pour un autre script no-op.

Hacky mais il travaillerait

2

Enregistrez ce qui suit comme /usr/local/bin/is_third_week_in_month.sh ou un lieu

#!/bin/bash 

if [ $# != 3 ] 
then 
    echo "Usage: $0 <yyyy> <mm> <dd>" 1>&2 
    exit 127 
fi 

YEAR=$1 
MONTH=$2 
DAY=$3 

FIRST_WEEK_IN_MONTH=`date +%V -d $YEAR-$MONTH-01` 
WEEK_FOR_DAY=`date +%V -d $YEAR-$MONTH-$DAY` 

DIFF=$(($WEEK_FOR_DAY - $FIRST_WEEK_IN_MONTH)) 

if [ $DIFF = 2 ] 
then 
    # this is the third week 
    exit 0 
else 
    exit 1 
fi 

puis ajouter à crontab

12 00 * * 1,2,3,4,5 your_command 
12 00 * * 6,7 test ! /usr/local/bin/is_third_week_in_month.sh `date "+%Y %m %d"` && your_command 

Ou vous pouvez modifier le script pour vérifier pour la date aussi bien si vous voulez avoir seulement une ligne dans crontab.

+0

Sur mon système, la date +% V imprime un zéro non significatif pour les numéros de semaine à un seul chiffre. Cela fait que le calcul de $ DIFF pense qu'il a des valeurs octales et échoue. Essayez d'exécuter ce script pour 2009 02 19, par exemple. Dénudez le zéro initial comme suit: FIRST_WEEK_IN_MONTH = 'date +% V -d $ YEAR- $ MOIS-01 | sed s/^ 0 //' --- et sur la ligne suivante --- WEEK_FOR_DAY = 'date +% V -d $ YEAR- $ MONTH- $ DAY | sed s/^ 0 // ' –

+0

En outre, le numéro de semaine ISO (% V) pour le 1er janvier peut être 52 (par exemple 2006) ou 53 (par exemple 2005) Le calcul $ DIFF est négatif et ne parvient pas à trouver la semaine 3 en janvier. Donc vous devriez changer le "% V" à "% W" qui commence toujours l'année en semaine zéro ou un et termine l'année en semaine 52 ou 53 (% V peut terminer l'année en 52, 53 ou 1). –

Questions connexes