Cron - Minden hónap első vasárnapja

Van nekem cronba egy ilyenem:


30 1 1-7 * *      root    [ "$(/bin/date '+%a')" == "Sun" ] && /root/scriptek/backup/backup-to-dione.sh >/dev/null 2>&1

Ez december 31-ig tökéletesen működött, január 1 óta nem, ilyen hibát ír minden nap amikor futna:


/bin/sh: -c: line 0: unexpected EOF while looking for matching `''
/bin/sh: -c: line 1: syntax error: unexpected end of file

Fogalmam sincs mi baja lett... Ötlet?

Hozzászólások

Persze, de nem a scripttel van a baj, hanem a date vizsgálattal.
Eredetileg ez volt:


30 1 1-7 * *      root    [ "x$(date '+%a')" == "xSun" ] && /root/scriptek/backup/backup-to-dione.sh >/dev/null 2>&1

De ugye már pár napja jön a mail és próbálkozok mindenfélével, de csak nem jó.
--
Discover It - Have a lot of fun!

Nem tudom, hogyan csinálja a cron, de nem kizárt, hogy a szögletes zárójelen belüli gömbölyűt érti félre. Lehet, így próbálnám:

[ x`date +%a` = xSun ] && /root/scriptek/backup/backup-to-dione.sh &>/dev/null

Itt nem kell túlzásba vinni az idézőjelezést, hiszen nem lesz üres a kimenet soha, de ha mégis, akkor ott az x. Szóköz szintén nem lesz benne.

Szerk.: Bashben ugyan megengedett az ==, ugyanakkor eredetileg = és != operátorok vannak stringekre, illetve <, >, ez utóbbiakat persze escape-elni kell, mert egyébként standard i/o átirányítások. A backtickkel megúszod a zárójelet és a dollárt.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

man 5 crontab:

The ``sixth'' field (the rest of the line) specifies the command to be
run. The entire command portion of the line, up to a newline or %
character, will be executed by /bin/sh or by the shell specified in the
SHELL variable of the crontab file. Percent-signs (%) in the command,
unless escaped with backslash (\), will be changed into newline charac-
ters, and all data after the first % will be sent to the command as
standard input. There is no way to split a single command line onto
multiple lines, like the shell's trailing "\".

Hogy eddig miért működött... Biztosan működött?

Nekem ez volt a logban:

(root) CMD ( [ "$(/bin/date '+)

A % elé egy \ mintha megoldotta volna a problémát. Azon még elmélkednem kéne, hogy a %-ot most a cron vagy ki akarja megenni, amikor tippre nem nagyon kéne neki.

Mivel az sh -c panaszkodik, nem kizárt, hogy az egész stringet idézőjelbe téve adják át az sh -c-nek, így az első kezdő idézőjel valójában bezárja az idézőjelet. Tehát lehet, én az idézőjelek elé tennék backslash-t, vagy talán hasonló gond lehet az aposztroffal.

Az, hogy eddig ment, most meg nem, lehet, a cron frissítésének következménye.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Az a rossz érzésem, ez csak tüneti kezelés. Szerintem aposztrofok közé rakva adta át a stringet, így a shell elől elzárva maradt a Te kezdő aposztrofodig - neki az volt a záró -, utána a shell látta a +%a-t, majd a záró aposztrofod volt neki kezdő, s ő a végén bezárja. Szóval ez így éppen működik, de nem általános szerintem. A jó még mindig az lenne, ha a scriptedben vizsgálnál, ahogy dj javasolta!

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Az ellenőrzést tedd a szkriptbe, legalábbis én így csinálom.

De miért kell feltétellel ellenőrizni, hogy vasárnap van-e, mikor a crontab ötödik oszlopa a "Day of week"?

30 1 1-7 * 7 root /root/scriptek/backup/backup-to-dione.sh ...

nem jó.

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 (ie, are
not *), 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.

Azert, mert a nap mezot ketfelekepp adhatod meg, es ha mind a kettot megadod, akkor azok OR-nak minosulnek. (Most abba mar ne menjunk bele, hogy kompatibilitasi okokbol a vasarnap hetessel valo megadasa eroteljesen ellenjavallt. 0 annak a becsuletes neve, es akkor nem fog az illeto meggebedni, amikor valami kereskedelmi Jujniksz rendszerrel talalkozik.

> Azert, mert a nap mezot ketfelekepp adhatod meg, es ha mind a kettot megadod, akkor azok
> OR-nak minosulnek

Na, ma is tanultunk valamit. (Mondjuk tény, hogy ilyen kombinációt még soha nem akartam csinálni.)

Fura egy logika, hogy a többi mező között ÉS kapcsolat van, itten pedig VAGY.

> Most abba mar ne menjunk bele, hogy kompatibilitasi okokbol a vasarnap hetessel valo
> megadasa eroteljesen ellenjavallt. 0 annak a becsuletes neve

Agreed.

A date paraméterében a "%a" a ludas, mert a cron is akar csinálni egy behelyettesítést, és véletlenül neki is pont a % a variable prefix.

man cron crontab es egyebek. A crontab fajlban a parancs mezoben a %-jel ENTER-re valik, a parancssor tovabbi resze pedig a parancs STDIN-je lesz - termeszetesen ha tovabbi %-ok vannak, azok is ENTER-re valnak.

A script indítását állítsd be minden vasárnapra, és a scripten belül vizsgáld meg, hogy hányadika van. Ha 7-nél több akkor lépjen ki.
-------------------
http://www.rtvstat.hu/ - A legtöbb magyar rádió és TV egy helyen!