[megoldva] Bash script kérdés

Fórumok

Valami ilyesmit szeretnék megvalósítani: egy gépen megosztottam egy mappát ("spool mappa"), amiben job.1...job.n fájlokban feladat definíciók vannak. A hálózat gépein futó azonos bash scripteknek össze kellene dolgozniuk: venni szépen sorban a job fájlokat, és végrehajtani a bennük definiált feladatokat. Megszorítás, hogy egyidőben egy feladaton csak egy script dolgozhat, mert különben összeakadnak.

Ennek biztosítására először egyszerű lock fájlokban gondolkodtam, amik jelzik a többi szkript számára, hogy az adott feladatot már valamelyik másik szkript példány elkezdte. Viszont azok ottmaradnak, ha a kérdéses szkript nem tud szabályosan kilépni, és ezután az adott job fájl (feladat) nem lesz végrehajtva.

Aztán arra gondolkodtam, hogy a .lock fájlt tartsa nyitva a feladatot végző szkript, és abból, hogy a lock fájlt valami nyitva tartja, a többi futó szkript példány tudja, hogy az a feladat már foglalt.
A konkrét megvalósítás ez lett volna:
touch job.n.lock; less job.n.lock &; pid=$! .... feladat végrehajtása ... ; kill $pid; rm job.n.lock

A többi script pedig egy
lsof job.n.lock
paranccsal ellenőrizhette volna a lock fájl nyitott voltát.

A gyakorlatban ez valamiért nem működik: az első lsof futtatáskor ezt kapom eredményül: "[7]+ Stopped less job.n.lock"; a további lsof futtatások pedig már nem írnak ki semmit, mintha a less már nem tartaná nyitva a .lock fájlt; pedig a ps szerint a less még fut. Less helyett vi-t használva ugyanez a helyzet.

Miért nem működik ez így, és milyen működő megoldást lehetne erre találni? Nincs esetleg egy olyan konzoli progi, ami semmi mást nem csinál, mint nyitva tart egy fájlt, amíg ki nem lövik?

Hozzászólások

egyidőben egy feladaton csak egy script dolgozhat

dotlockfile kell neked.

[a lock file-ok] ottmaradnak, ha a kérdéses szkript nem tud szabályosan kilépni

Ehhez meg trap (bash parancs).

Ez van most. Nagyon egy hullámhosszon vagyunk :)))

Csak az a baj, hogy az egyik gépen futó script nem tudhatja, hogy a másik gépen milyen processzek futnak.
Nem akarom emiatt ssh-val tovább bonyoltíani a scriptet; biztosan meg lehet valahogy oldani, hogy a .lock fájlt minden script nyitva tartsa, ezzel a lehető legegyszerűbb módon tájékoztatva a többi szkriptet arról, hogy fut.

---
Mondjon le!

"Nincs esetleg egy olyan konzoli progi, ami semmi mást nem csinál, mint nyitva tart egy fájlt, amíg ki nem lövik?"

AEE, NANO, PICO, ED, JOE (?) és még mennyi van?

De valószínű, hogy nem ezen múlna. Olyan, mintha a lock file-ok "nem olvadnának fel", és ez beragasztja az egészet.

Egy olyan ötletem van, hogy ha nem muszály pontosan egyidőben futni minden masinának, akkor manuálisan megszabhatod az ütemezését az AT paranccsal, amibe különböző időpontokat adsz meg (amit mondjuk különböző file-ból szednének ki az egyes gépek)... Itt az a kérdés, hogy melyik script mikor induljon el az egyes gépeken, illetve azzal tudsz futási időt nyerni, hogy kideríted, hogy egy-egy script reálisan kb mennyi ideig fut. Tehát végülis Te leszel az ütemezője.

"AEE, NANO, PICO, ED, JOE (?) és még mennyi van?"

Ezen az alapon már a vi-nek, vagy a less-nek is jónak kellett volna lennie, azok mégis "elengedték" a fájlt az első lsof hozzáféréskor. Nem értek annyira hozzá, hogy tudjam mi okozza ezt, de az a határozott érzésem, hogy az aee...joe "csapat" ebből a szempontból ugyanígy viselkedne...

"akkor manuálisan megszabhatod az ütemezését az AT paranccsal"
Automatikusan szeretném.

"egy-egy script reálisan kb mennyi ideig fut"
Végszükség esetén (ha a "nyitvatartásos" megoldás nem megy) ez lesz. De csak nagyon durván lehet megsaccolni, hogy egy-egy feladat mennyi ideig fut, és komoly rátartás is kell, mert a feladatot végző processzek alacsony prioritással futnak majd, ezért a rendelkezésükre álló erőforrás különösen erősen függ a rendszer aktuális terhelésétől.

---
Mondjon le!

Végül kézbe vettem az ügyet, és megírtam (vagyis inkább összeollóztam) az első c programomat, ami semmi mást nem csinál, mint megnyit egyfájlt, aztán sleep-el bőszen, amíg ki nem lövik.
Ez így jó lesz arra, hogy a szkriptek folyamatosan tudassák egymással a működésüket, úgyhogy a probléma megoldva.

---
Mondjon le!