Feledékeny bash?

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?

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!

"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!

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

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!