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.

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)


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.