Van egy szkriptem, ami hol az elvárt módon működik, hol nem (többnyire nem).
Nagyjából így néz ki:
mkdir=/bin/mkdir tempsubmappa=`$mktemp -d` probix=1 while [[ $probix -le 4 ]]; do echo "$$: parancs: $mkdir $tempsubmappa/$probix" >> $dojoblog $mkdir "$tempsubmappa/$probix" # Itt pár perces kódolási munka van, közben a cron a szkript # egy másik példányát is elindítja, de az észreveszi # hogy nincs egyedül, és kilép (csak az első példány # fut tovább) let "probix = $probix + 1" done echo "$$: Parancs: $mkdir $tempsubmappa/sub" >> $$dojoblog $mkdir "$tempsubmappa/sub"
Most bekukkantottam a $dojoblog logfájlba, és érdekes dolgot találtam, ez van benne:
8873: parancs: /bin/mkdir /tmp/tmp.PLePKZ8907/1
8873: parancs: /bin/mkdir /tmp/tmp.PLePKZ8907/2
8873: parancs: /bin/mkdir /tmp/tmp.PLePKZ8907/3
8873: parancs: /bin/mkdir /tmp/tmp.PLePKZ8907/4
8873: parancs: /tmp/tmp.PLePKZ8907/sub
Azaz, úgy tűnik, hogy a ciklus belsejében még benne volt a $mkdir változóban a "/bin/mkdir" érték, a ciklus után meg a változó üres volt, ezért a /tmp/tmp.PLePKZ8907/sub mappa nem lett létrehozva, és a szkript "dugába dőlt".
Hogy lehet az, hogy a $mkdir változó, ami a szkript elején értéket kapott, egyszer csak kiürült?
Lehet ez összefüggésben azzal, hogy a szkript futása közben a cron a szkript egy másik példányát is indította (de az magától kilépett, mert egyszerre csak egy példányban futhat)?
Mintha azt venném észre, hogy akkor nincs gond, ha a szkript elég gyorsan lefut ahhoz, hogy időközben nem indul második példánya (azaz a kódolási munka elég hamar lefut).
De miért csak a $mkdir változót érinti ez a probléma? A szkript más változói látszólag "sose ürülnek ki"!
Tudtok valami magyarázatot erre?
- 1196 megtekintés
Hozzászólások
Csak kíváncsiág, kicsi az esélye, hogy köze lenne a dologhoz:
hogy néz ki a crontab bejegyzés?
+1 tipp: Az utolsó kiírásnál nem kerülhetett valami szemét a parancssorba? Mivel hibaüzenetet nem látok, én arra tippelnék, hogy csak az echo hibázik, mögötte a parancs lefut. Vagy a hibaüzenetet kihagytad?
--
Fel! Támadunk!
- A hozzászóláshoz be kell jelentkezni
"hogy néz ki a crontab bejegyzés?"
Így:
PATH="/home/szucs/bin:/usr/local/bin:/usr/bin:/usr/X11R6/bin:/bin:/usr/games:/opt/gnome/bin:/opt/kde3/bin:/usr/lib/java/jre /bin" */10 * * * * /usr/local/bin/dvddir2ogm.dojob.sh
(Tudom: benne van a PATH a crontab-ban, ezért nem kellene a parancsokat teljes útvonallal megadni, de a szkriptet más gépeken/rendszereken is használom/használják, és erre azt a technikát fejlesztettem ki, hogy a szkript elején változóba teszem a meghívott parancsokat, mert így egy helyen van minden, ami a szívás elkerüléséhez kell - ez nálam egy rigolya, amiből nem engedek :-).)
"Az utolsó kiírásnál nem kerülhetett valami szemét a parancssorba?"
Kizárt; már ezerszer ellenőriztem a szkriptnek ezt a részét (meg az egész szkriptet is).
"én arra tippelnék, hogy csak az echo hibázik, mögötte a parancs lefut."
Igen, de akkor a szkriptnek rendben le kellene futnia, azaz létre kellene jönnie a kódolt fájlnak abban a bizonyos "/tmp/tmp.AkTMP12242/sub" mappában; majd a szkript ezután a végleges helyére másolná. Csakhogy sosem kerül a fájl a végleges helyére.
Pedig amikor az egyes parancsokat konzolból sorban begépelem, akkor minden tökéletesen működik.
"Vagy a hibaüzenetet kihagytad?"
A hibaüzeneteket nem irányítottam a $dojoblog fájlba, azokat a cron úgyis beteszi a postafiókomba.
Ami viszont emiatt olyan nagyra nőtt, hogy épp a szkript legutolsó próbafuttatásakor töröltem. (Én sem emlékeztem már arra, hogy a hibaüzeneteket nem íratom a logfájlba, és kellett a hely a /tmp partíción).
A következő kódolási feladat előtt megmódosítom a szkriptet úgy, hogy tegye azokat is a logfájlba.
De addig is majdnem 100%-ig biztos vagyok abban, hogy a $mkdir változó kiürülése okozza a problémát.
A megoldás ugye, most hogy már nagyjából rájöttem a hiba okára nem ügy: fixen beírom a /bin/mkdir hivatkozást a változó használat helyett , és fakereszt.
Szigorúan a miheztartás végett szeretnék ennek a dolognak a végére járni...
Szóval szerinted kizárt, hogy egyazon szkript cron által különböző időpontokban indított példányai egymás változóit matatnák?
---
If you have money, use Windows!
However, if you also have a brain, use Linux!
- A hozzászóláshoz be kell jelentkezni
Hirtelen ez tünt fel (let "probix = $probix + 1"), ami helyesen így van: let probix++
Utólag: az idézőjeles formulát jellemzően az expr használja, de annak a szintaktikája nem így néz ki.
ELaci
- A hozzászóláshoz be kell jelentkezni
Majd kiverte a szememet, mégis csak most vettem észre a dupla $-jelet: $$dojoblog.
Szóval az az echo-s sor egy betűt sem írt a logfájlba, a neki tulajdonított log bejegyzést pedig egy későbbi, itt nem közölt sor tette, de az már indokoltan.
Vagyis a "$mkdir" változó kiürüléses teóriám ugrott, mehet tovább a hibakeresés megint nulláról :-(
Kösz a segítőkészséget, és bocs a hülyeségemért :-(
---
If you have money, use Windows!
However, if you also have a brain, use Linux!
- A hozzászóláshoz be kell jelentkezni
Ha jól látom, eddig legalább hárman nem vettük észre :)
--
Fel! Támadunk!
- A hozzászóláshoz be kell jelentkezni