Cronjob odbywa się co dwa tygodnie, w sobotę, począwszy od tej soboty

11

Dzisiaj jest piątek, 3 października 2014 03:58

Chcę zaplanować cronjob, aby uruchamiał go w następujących terminach:

  1. Sobota, 4 października 2014 08:00
  2. Sobota, 18 października 2014 08:00
  3. Sobota, 1 listopada 2014 08:00 ... ...

Co 2 tygodnie, w sobotę o godzinie 8.

kupa
źródło

Odpowiedzi:

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

date +%W: numer tygodnia z poniedziałkiem jako pierwszym dniem tygodnia, dziś tydzień 39

10#$(date +%W): przekonwertuj na date +Wliczbę dziesiętną i unikaj pomyłki podczas analizowania bazy powłoki

$((39%2)): działanie modulo: wynik to 0 (parzysty numer tygodnia) lub 1 (nieparzysty numer tygodnia), w tym tygodniu wynik to 1, następny tydzień 0

test 1 -eq 1: test arytmetyczny (równy), w tym przypadku wynik ma wartość logiczną prawda

&& yourCommand: Boolean AND: uruchom yourCommandtylko, jeśli wynik poprzedniego polecenia był logiczny true

Pamiętaj, że rok może mieć dwa nieparzyste tygodnie: 53 (w tym roku) i 1 (w przyszłym roku)

Cyrus
źródło
2
To eleganckie! Jak zauważono, nadal ma ona zasadnicze znaczenie w 53. sobotę roku, co nastąpi około siedemdziesiąt lat na każde cztery stulecia.
MadHatter
@ Cyrus dziękuję za odpowiedź, ale jeśli napiszę * * * * 5 test $ (($ (data +% W)% 2)) -eq 1 && /u02/restore/scripts/test.sh skrypt nie uruchom, ale jeśli napiszę * * * * 5 /u02/restore/scripts/test.sh skrypt zostanie uruchomiony. dlaczego twoje wyrażenie nie działa? Właśnie testowałem przypadki i okazało się, że to nie działa.
kupa
1
Mój błąd. Cron interpretuje% jako znak nowej linii. Ucieknij oba% za pomocą \ w kronice:0 8 * * 6 test $(($(date +\%W)\%2)) -eq 1 && yourCommand
Cyrus
Niestety, aby przywrócić ten stary pytanie, ale to nie działa dla mnie i gdy próbuję wykonać $((10#$(date +%W)%2)) -eq 1 && echo OKmoje prób powłoki wykonać wynik obliczeń tygodniu: -bash: 1: command not found. Wszelkie wskazówki, dlaczego to robi? Dzięki.
jhuet
3
@ jhuet: testnie jest użytkownikiem, to polecenie. Spróbuj:test $((10#$(date +\%W)%2)) -eq 1 && echo odd || echo even
Cyrus
4

To, co pokazałeś, to „co tydzień”. Zatem kod to:

0 8 * * 6

Czy na pewno musisz uruchamiać go co dwa tygodnie?

0 8 * * 6 expr `date +\%s` / 604800 \% 2 >/dev/null || yourCommand
Glueon
źródło
1
Czy możesz wyjaśnić polecenie, proszę
kupa
1
Lepiej jest użyć tego, co dał Cyrus - $ (($ (data +% W)% 2)) „W” oznacza liczbę tygodni w roku. Zaczynając od zera do 53. Jeśli można go podzielić na dwa, to jest to Twój „co drugi” tydzień. Więc cronjob działa co tydzień, ale polecenie „expr” wykonuje polecenie komendy tylko wtedy, gdy liczbę tygodnia można podzielić przez 2.
Glueon
kiedy uruchamiam test $ (($ (data +% W)% 2)) -eq 1 w wierszu poleceń nic nie zwraca, dlaczego?
kupa
1
po prostu uruchom echo $?po uruchomieniu tego polecenia, aby zobaczyć jego kod powrotu - to jest z nim ważne
Ale