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?
- 5466 megtekintés
Hozzászólások
A scripted rendes promtból fut?
- A hozzászóláshoz be kell jelentkezni
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!
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Így se jó:
/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file
- A hozzászóláshoz be kell jelentkezni
Akkor a legtisztább, ha megfogadod dj javaslatát. A cronból mindenféle ellenőrzés nélkül indítod a scripted, azon belül megvizsgálod, vasárnap van-e, s ha nem, kilépsz.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
Valóban ciki. Ez vaskosan RTFM volt.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
ha így csinálnád?
00 09 * * 7 [ $(date +\%d) -le 07 ] && /run/your/script
http://stackoverflow.com/questions/3241086/cron-how-to-schedule-to-run-…
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Nem frissítettem semmit.
--
Discover It - Have a lot of fun!
- A hozzászóláshoz be kell jelentkezni
Különben amit javasoltam, az idézőjeles feltételezésemre egy workaround. Nem szép, de ha ez a baja, működne.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Bingó... \%a jó. :)
Csak azt nem tudom, hogy akkor eddig hogy ment.
--
Discover It - Have a lot of fun!
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Majd meglátjuk, ez így szerintem elegánsabb... :) A script csak csinálja a dolgát, akkor is ha kézzel indítom, az időzítés meg legyen a cronba.
--
Discover It - Have a lot of fun!
- A hozzászóláshoz be kell jelentkezni
Erre lehet olyasmit csinálni, hogy ha a scripted kap valamilyen paramétert, akkor ellenőrzi a dátumot, ha pedig nem, akkor nem ellenőriz semmit. Így a kézi futtathatóság is megmarad. Bár tény, hogy a \% jó megfejtés.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Tok mindegy, a cron elobb veszi eszre es helyettesiti a %-ot, szoval az a \% a helyes megoldas.
- A hozzászóláshoz be kell jelentkezni
Az ellenőrzést tedd a szkriptbe, legalábbis én így csinálom.
- A hozzászóláshoz be kell jelentkezni
+1
Ezzel minden probléma megoldódik egycsapásra.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
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 ...
- A hozzászóláshoz be kell jelentkezni
Kizárólag a hónap első vasárnapja érdekli ha jól értem.
Szerk.: ja bocs, a te megoldásod jó :)
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
> 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 hozzászóláshoz be kell jelentkezni
"Na, ma is tanultunk valamit."
Fel nem tételeztem volna ezt az OR-t... annál is inkább nem, mert illogikus, hiszen OR-nak ott van a cron rekord duplázása.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
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!
- A hozzászóláshoz be kell jelentkezni