nem a várt módon működik a cron

Fórumok

Sziasztok, azt a feladatot kaptam, hogy minden hónap 1. és 3. hétfőjén futtassak le egy scriptet, gondoltam, automatizálom. Előkaptam a crontabot, és beszúrtam ezt:

0 7 1-7,15-21 * 1 /usr/local/bin/script

Gondoltam ezzel végeztem is, de valami nem kerek, mert minden reggel lefuttatja :-(

A gugli találatok szerint is jól csináltam, van valakinek erre megoldása?

Hozzászólások

Szerkesztve: 2020. 09. 03., cs - 17:02

A gugli találatok szerint is jól csináltam

A gugli sem érthet mindenhez. A manual ezt mondja:

Note: The day of a command's execution can be specified by two fields —
day of month, and day of week.  If both fields are restricted (i.e.,
aren't *), the command will be run when either field matches the current
time.  For example, “30 4 1,15 * 5” would cause a command to be run at
4:30 am on the 1st and 15th of each month, plus every Friday.

Valami hasonló?

0 7 1-7,15-21 * * /bin/date "+\%w" | /bin/fgrep -sq 1 && /usr/local/bin/script

Dolpa

Én is azt mondanám a "-" ranget jelöl így  és a man alapján inkább így : 

0 7 1,7,15,21 * 1 /usr/local/bin/script

 

“At 07:00 on day-of-month 1, 7, 15, and 21 and on Monday.”

https://crontab.guru/#0_7_1,7,15,21_*_1

Szerkesztve: 2020. 09. 04., p - 01:41

A problémát egy félreértés okozza, az "és" szó nem logikai és műveletet jelent, hanem inkább "és lefut"-ot kell érteni alatta. Azaz a fenti formátum lefut a hónap első 7 napján, és lefut a hónap 15-21. napján, és lefut hétfőnként 7:00-kor. A Crontab guru jól mondja, csak pontosan kell fordítani.

Van egy Quarz nevű cron klón, ott a "0 0 7 ? * 2#1,2#3" formátummal tudod megoldani amit szeretnél.

http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html

A cron nem ennyire részletes, legközelebb a "0 7 */2 * 1" formátummal juthatsz, itt vagy az első és harmadik hétfőn fut le, vagy néha a másodikon és negyediken (pl. novemberben). Attól függ mikor, hogy a hétfő páros vagy páratlan napra esik. Ha ez nem jó, akkor a "0 7 * * 1" formátummal lefut minden hétfőn 7-kor, és egy közbeiktatott sctiptnek kell kiszámolni a többit.

A csalódás felesleges. Ahogy Mauzi elég korán jelezte, a dokumentáció teljesen egyértelmű: kétféleképp lehet megadni a "nap" információt. Meg lehet adni hónap-napja formában (ez a 3. mező, ha jól csalódok) és meg lehet adni hét-napja formában is (ez pedig az 5. mező. Ha mind a kettő explicit módon van megadva, akkor *bármelyik* teljesülése esetén lefut a megadott parancs. A klasszikus példa az, hogy minden péntek 13-án akarunk futtatni, akkor nem javasolt a hónap-napja mezőt 13-ra, a hét-napja mezőt pedig 5-re állítani, mert minden pénteken ÉS minden hó 13-án le fog futni. Hanem eldöntöd, hogy neked melyik feltételt könnyebb egy plusz paranccsal letesztelned - azt beteszed a futtatandó parancs elé plusz feltételként (mint itt több helyen : [ ... ] && formában) , és a másik feltételt állítod be a cronban.

"A gugli találatok szerint is jól csináltam" Alighanem ezt találtad meg:

07 13 8-14 * * [ `date +\%u` = 3 ] &&  /root/scripts/test.sh

Ebből kihagytad a [] közötti részt, ami a "valódi" ellenőrzést végzi.

Szóval neked ilyesmi kéne:

0 7 1-7   * * [ `date +\%u` = 1 ] && /usr/local/bin/script
0 7 15-21 * * [ `date +\%u` = 1 ] && /usr/local/bin/script

Nem ellenőriztem le, de fogjuk rá hogy hihető.

Végre egy jó topik.

> Sol omnibus lucet.

Csak egy tipp:
Mi van akkor ha azt a feltételt nem cronnal vizsgálod, hogy az adott nap a hónap első/harmadik hetének hétfője, hanem a scripted elejébe teszed ezt meg?