Cronjob a lieu toutes les deux semaines, samedi, à partir de ce samedi

11

Aujourd'hui est vendredi 3 octobre 2014 03:58

Je veux planifier un cronjob comme ça pour l'exécuter aux dates suivantes:

  1. Samedi 4 octobre 2014 08:00
  2. Samedi 18 octobre 2014 08:00
  3. Samedi 1 novembre 2014 08:00 ... ...

Donc toutes les 2 semaines, le samedi, à 8 heures.

kupa
la source

Réponses:

27
0 8 * * 6 test $((10#$(date +\%W)\%2)) -eq 1 && yourCommand

date +%W: numéro de semaine de l'année avec lundi comme premier jour de la semaine, aujourd'hui semaine 39

10#$(date +%W): convertir le date +Wnombre décimal et éviter la confusion d'analyse de la base du shell

$((39%2)): opération modulo: le résultat est 0 (numéro de semaine pair) ou 1 (numéro de semaine impair), le résultat de cette semaine est 1, la semaine prochaine 0

test 1 -eq 1: test arithmétique (égal), dans ce cas le résultat est booléen vrai

&& yourCommand: Boolean AND: exécuté yourCommanduniquement si le résultat de la commande précédente était booléen true

Notez que l'année peut avoir deux semaines impaires: 53 (cette année) et 1 (l'année prochaine)

Cyrus
la source
2
C'est élégant! Il a encore, comme vous l'avez noté, un cas d'angle le 53e samedi de l'année, qui se produira environ soixante-dix ans tous les quatre siècles.
MadHatter
@Cyrus merci pour votre réponse, mais si j'écris * * * * 5 test $ (($ (date +% W)% 2)) -eq 1 && /u02/restore/scripts/test.sh le script ne fonctionne pas exécuter mais si j'écris * * * * 5 /u02/restore/scripts/test.sh s'exécute. pourquoi votre expression ne fonctionne-t-elle pas? Je testais simplement les cas et j'ai constaté que cela ne fonctionnait pas.
kupa
1
Mon erreur. Cron interprète% comme une nouvelle ligne. Échapper aux deux% avec un \ dans votre cronjob:0 8 * * 6 test $(($(date +\%W)\%2)) -eq 1 && yourCommand
Cyrus
Désolé pour ramener cette vieille question , mais il ne fonctionnait pas pour moi et quand je tente d'exécuter $((10#$(date +%W)%2)) -eq 1 && echo OKmes shell tente d'exécuter le résultat du calcul de la semaine: -bash: 1: command not found. Un indice pourquoi il fait ça? Merci.
2017
3
@jhuet: testn'est pas un utilisateur c'est une commande. Essayez:test $((10#$(date +\%W)%2)) -eq 1 && echo odd || echo even
Cyrus
4

Ce que vous avez montré, c'est "chaque semaine". Alors le code est:

0 8 * * 6

Êtes-vous sûr de devoir l'exécuter toutes les deux semaines?

0 8 * * 6 expr `date +\%s` / 604800 \% 2 >/dev/null || yourCommand
Glueon
la source
1
Pouvez-vous expliquer la commande, s'il vous plaît
kupa
1
Il vaut mieux utiliser ce que Cyrus a donné - $ (($ (date +% W)% 2)) "W" représente un numéro de semaine de l'année. De zéro à 53. Si elle peut être divisée par deux, alors c'est votre semaine "toutes les secondes". Donc cronjob s'exécute chaque semaine, mais l'exprime n'exécute la commande yourCommand que si le numéro de la semaine peut être divisé par 2.
Glueon
lorsque j'exécute le test $ (($ (date +% W)% 2)) -eq 1 sur la ligne de commande ne renvoie rien, pourquoi?
kupa
1
il suffit de lancer echo $?après avoir exécuté cette commande, pour voir son code de retour - c'est ce qui est important avec elle
Ale