Cronjob ogni due settimane, sabato, a partire da questo sabato


11

Oggi è Venerdì 3 ottobre 2014 3:58

Voglio pianificare un cronjob come quello per eseguirlo alle seguenti date:

  1. Sabato 4 ottobre 2014 8:00
  2. Sabato 18 ottobre 2014 8:00
  3. Sabato 1 novembre 2014 8:00 ...

Quindi ogni 2 settimane, sabato, alle 8 in punto.

Risposte:


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

date +%W: numero della settimana dell'anno con il lunedì come primo giorno della settimana, oggi settimana 39

10#$(date +%W): converte il date +Wnumero decimale ed evita la confusione dell'analisi della base della shell

$((39%2)): operazione modulo: il risultato è 0 (numero settimana pari) o 1 (numero settimana dispari), il risultato di questa settimana è 1, settimana successiva 0

test 1 -eq 1: test aritmetico (uguale), in questo caso il risultato è booleano true

&& yourCommand: AND booleano: eseguito yourCommandsolo se il risultato del comando precedente era booleano true

Si noti che l'anno può avere due settimane dispari: 53 (quest'anno) e 1 (l'anno successivo)


2
È elegante! Come hai notato, ha ancora una valigetta il 53 ° sabato dell'anno, che accadrà all'incirca settant'anni ogni quattro secoli.
MadHatter,

@Cyrus grazie per la tua risposta, ma se scrivo * * * * 5 test $ (($ (data +% W)% 2)) -eq 1 && /u02/restore/scripts/test.sh lo script non corri ma se scrivo * * * * 5 /u02/restore/scripts/test.sh viene eseguito lo script. perché la tua espressione non funziona? Stavo solo testando i casi e ho scoperto che in qualche modo non funzionava.
kupa,

1
Errore mio. Cron interpreta% come newline. Fuggi entrambi dal% con un \ nel tuo cronjob:0 8 * * 6 test $(($(date +\%W)\%2)) -eq 1 && yourCommand
Cyrus,

Siamo spiacenti di riportare questa vecchia domanda, ma non funzionava per me e quando provo ad eseguire $((10#$(date +%W)%2)) -eq 1 && echo OKi miei tentativi di shell per eseguire il risultato del calcolo settimana: -bash: 1: command not found. Qualche idea sul perché lo stia facendo? Grazie.
jhuet,

3
@jhuet: testnessun utente è un comando. Prova:test $((10#$(date +\%W)%2)) -eq 1 && echo odd || echo even
Cyrus

4

Quello che hai mostrato è "ogni settimana". Quindi il codice è:

0 8 * * 6

Sei sicuro di doverlo eseguire ogni due settimane?

0 8 * * 6 expr `date +\%s` / 604800 \% 2 >/dev/null || yourCommand

1
Puoi spiegare il comando, per favore
kupa,

1
È meglio usare ciò che Cyrus ha dato: $ (($ (data +% W)% 2)) "W" sta per un numero di settimana dell'anno. A partire da zero a 53. Se può essere diviso per due, allora è la settimana "ogni secondo". Quindi cronjob viene eseguito ogni settimana ma "expr" esegue il comando yourCommand solo se il numero della settimana può essere diviso per 2.
Glueon,

quando eseguo test $ (($ (data +% W)% 2)) -eq 1 sulla riga di comando non restituisce nulla, perché?
kupa,

1
corri solo echo $?dopo aver eseguito quel comando, per vedere il suo codice di ritorno - questo è ciò che è importante con esso
Ale
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.