Jak zaplanować cronjob co dwa tygodnie?

11

crontab (5) definiuje następujące pola:

       field         allowed values
       -----         --------------
       minute        0-59
       hour          0-23
       day of month  1-31
       month         1-12 (or names, see below)
       day of week   0-7 (0 or 7 is Sun, or use names)

i wyjaśnia:

 Step values can be used in conjunction with ranges.  Following a range
 with ``/<number>'' specifies skips of the number's value through the
 range.  For example, ``0-23/2'' can be used in the hours field to specify
 command execution every other hour (the alternative in the V7 standard is
 ``0,2,4,6,8,10,12,14,16,18,20,22'').

Tak więc, o ile rozumiem, nie ma dwutygodniowych ofert pracy. Jestem pewien, że istnieją obejścia, jakie są twoje? A może coś przeoczyłem?

rzymski
źródło
2
Najlepsza odpowiedź na to pytanie znajduje się tutaj: unix.stackexchange.com/questions/1224/…
Somantra
... i te odpowiedzi na temat U&L byłyby takie, jak bym to zrobił, @Somantra :-)
voretaq7
@ voretaq7, powiedziałbym, że to kanoniczna odpowiedź, ale nie chciałem być tak pedantyczny ;-)
Somantra

Odpowiedzi:

8

Możesz sprawić, by cron prowadził ją w każdą środę, a następnie poproś, aby rzecz zdecydowała, czy jest to tydzień parzysty czy dziwny. na przykład:

#!/bin/bash
week=$(date +%U)
if [ $(($week % 2)) == 0 ]; then 
    echo even week
else 
    echo odd week
fi
gulasz
źródło
To miłe rozwiązanie, jednak tak naprawdę nie odpowiada na pytanie - wolałbym nie brudzić tego logiką harmonogramu. Może uda mi się to zintegrować z linkiem podanym przez @Somantra.
Rzym.
W porządku, muszę przyznać: to jak dotąd najlepsze rozwiązanie. Link, który podał @Somantra, osiąga te same wyniki niepotrzebnie złożone IMHO (licząc z czasem UNIX), ale dodanie twojego podejścia bezpośrednio do cronjob (zamiast do skryptu) w tym samym stylu czyni go dość eleganckim.
Rzym.
To zrywa w roku 2020, ponieważ ma 53 tygodnie. Np .: Jeśli twój cron miał działać co dwa tygodnie 31 grudnia, działałby 31 grudnia 2020 r. (53 tydzień) i 4 stycznia 2020 r. (1 tydzień).
mad_fox
5

Zakresy obsługi wielu cronów (nie określiłeś, których używasz). Coś w stylu

0 0 1-7,15-21 * 3

Uderzy w pierwszą i trzecią środę miesiąca.

quadruplebucky
źródło
jest to nieco bardziej eleganckie niż metoda „zrób to w skrypcie”, ale pamiętaj, aby dodać komentarz do swojego crontab (ogólna zasada: jeśli masz więcej niż jeden -lub jest /zaangażowany, prawdopodobnie warto skomentować, aby opisać harmonogram)
voretaq7
Podejrzewam, że to źle; spowoduje to, że zadanie będzie uruchamiane w dniach 1-7 i 15-21 każdego miesiąca, a także w każdą środę. To z man 5 crontab: „ Dzień wykonania polecenia może być określony przez dwa pola - dzień miesiąca i dzień tygodnia. Jeśli oba pola są ograniczone (tzn. Nie są *), polecenie zostanie uruchomione, gdy jedno z pól będzie pasować do aktualny czas. Na przykład „30 4 1,15 * 5” spowoduje, że polecenie zostanie uruchomione o 4:30 rano 1 i 15 każdego miesiąca oraz w każdy piątek ”(moje podkreślenie).
MadHatter,
1
W rzeczywistości zależy to od używanego demona cron. Wygląda na to, że twój wpis pochodzi z vixie cron (zawartej w dystrybucjach RedHat). Z „man crontab” na cronie dillo (Slackware): Jeśli podasz zarówno dzień w miesiącu, jak i dzień tygodnia, * będzie to interpretowane jako N-ty taki dzień w miesiącu *. Mimo to rozwiązanie skryptowe (obliczające liczbę tygodni) wygląda jak jedyne rozwiązanie przenośne.
AlvaroGMJ
2

Aby uzyskać coś, co musi być uruchamiane co drugi tydzień, skorzystaj z tej linijki:

0 0 * * 5 [ `expr \`date +\%V\` \% 2` -eq 0 ] && echo "execute script" 

Ten konkretny skrypt ma zostać uruchomiony w piątki. Tydzień do wykonania można ustawić za pomocą „-eq 0” lub „-eq 1”

AlexY
źródło
1

Anacron jest dobrym obejściem ograniczeń crona.

  • Anacron ma parametr Okresu nawrotu, który można ustawić na 14.

polecenie opóźnienia zadania-identyfikator

14 15 test.daily /path/to/script.sh

Somantra
źródło
Niestety nie można użyć anakronu. Zapomniałem o tym wspomnieć.
Rzym.
1

Jeśli twoje potrzeby nie są dosłownie dwa razy w tygodniu, możesz po prostu uruchomić cronjob 1 i 15 dnia miesiąca:

15 8 1,15 * * /your/script.sh

Który działa o 8:15 rano pierwszego i piętnastego każdego miesiąca, niezależnie od dnia tygodnia.

Chris Brewer
źródło
-2

Z tego wyjaśnienia ustawienie 3/2 w polu tygodnia powinno uruchamiać zadanie w każdą drugą środę - jest to niejawne, ale myślę, że wykonalne.

Journeyman Geek
źródło
nie, jest to równoważne, for(int i=3; i <=3 ; i+=2) {} ponieważ przechodzi przez to tylko raz, nie ma znaczenia, czy „krok” to 1 czy 2.
dusić
Co powiedział @stew. Ponadto nie ma „pola tygodnia”.
Rzym.
Przez pole tygodnia rozumiem „Dzień tygodnia”
Journeyman Geek