E-mail
















 

Indítóelemek Mac OS X alatt


Semmi kétség, hogy a Mac OS X népszerű a rendszeradminok és -fejlesztők között. Ezek azok az emberek, akik komolyan leásnak a rendszer mélyére, kiássák azokat a UNIX parancsokat, amelyek a rendszerkarbantartásban és a fejlesztői feladatokban hasznosak. Ez a legnagyobb csábereje. A legtöbb platformon a programok és szolgáltatások indításkor történő beállítása bonyolult vagy egyáltalán nem lehetséges. A Mac OS X egy egyszerű és pontos módszert kínál a kívánt programok, szolgáltatások vagy bármilyen shell szkript futtatására indításkor. Anélkül, hogy az rc szkriptbe bele kellene nyúlnod, ami meg root loginnal sem egyszerű, mert csak futtatható jog van rajta.

Ezeket az elemeket Indítóelemeknek hívják, amelyek könyvtárkötegek. Adott mappában megfelelő fájlok találhatóak.

Első példaként nézd meg, hogyan kell egy indítóelemek létrehozni, és hogyan lehet az Apache Tomcat Java Servlet szolgáltatását elindítani. Látni fogod, mennyire egyszerű és rugalmasan bővíthető szolgáltatásról van szó.

Mik azok az Indítóelemek?

Ezek olyan elemek, amelyek a rendszer indításakor futnak le. Ez sajátos az X rendszerben, nincs init.d könyvtára. Ha kíváncsi vagy, milyen parancsok futnak le indításkor, alkalmazd az Alma (Command) és V kombinációt, mielőtt a szürke logót látod indításkor. Az utolsó sorban van egy systemstarter nevu program indítása, a systemstarter -g ${VerboseFlag} ${SafeBoot}, ő rendezi az indítóelemeket, és a grafikus többfelhasználós üzemmódot. Az /sbin mappában található a többi rendszerfelügyelő és karbantartó paranccsal együtt. (Sajnálatos módon a man nem találja meg a manuál oldalát, bár ha rákeresel meglelheted, ennél kényelmesebb az oldal használata.)

Kattints már rám! Az Indítóelemek olyan programok, amelyek az ébredezésnél futnak, vagy kilépnek futtatásuk után, vagy nyitva maradnak a számítógép kikapcsolásáig. Egyszerű szolgáltatásnak tűnik, de sok egyéb funkcióval is rendelkezik, ami megkülönbözteti a Mac OS X más hasonló szolgáltatásaitól, illetve más operációs rendszerek hasonló mechanizmusaitól. Az egyik leghasznosabb tulajdonság az Indítóelemeknél az egymásra épülés és az egymásra épülési feltételek.

Mondjuk, hogy futtatás alatt van az Apache webszerver és a Tomcat szervlet motor. A Tomcat úgy van beállítva, hogy minden kérése az Apache szerveren menjen keresztül. Indításnál ezek szerint úgy kell beállítani, hogy a Tomcat az Apache előtt töltődjön be, mégpedig csak akkor, ha az Apache sikeresen betöltődött. A legtöbb operációs rendszer az indítást shell szkripteken keresztül valósítja meg. Ez a szkript tartalmazhatná azt a kódot, amely az Apache szervert és a Tomcat motort elindítja, egy ellenőrzéssel a kettő között, hogy biztos legyen abban, hogy az Apache sikeresen betöltődött, mielőtt a Tomcat motort meghívná.

Ez még nem is bonyolult, de tegyük fel, hogy a Tomcat futás közben lekérdez egy MySQL adatbázist, tehát csak akkor szabad betöltődnie a Tomcat motornak, ha a MySQL is be van töltve. A MySQL szervernek pedig egy csatolt NFS lemezre van szüksége, így előbb azt is csatolni kell. Ha pedig az IP szolgáltatásokat is szeretnél használni, amelyek mind az Apache, MySQL és Tomcat szolgáltatásokra épülnek, az Apache szervernek szüksége van a Samba, a Tomcat motornak az LDAP, a Kötet Szolgáltatásoknak a többi szolgáltatásra. Így már kellőképpen bonyolult, mert egymásba ágyazott feltételeket tartalmaz, amelyeket bele kell építeni az ébredezési folyamatba.

Lássuk, mit is kínál fel a Mac OS X erre a problémára. Az ébredezés alatt összeállít egy listát a futtatandó Indítóelemekről, és ezt a listát rendezi szem előtt tartva az Indítóelemek közötti egymásra épüléseket. Ha egy Indítóelemet hozzáadsz vagy eltávolítasz nem kell egy szkriptet sem módosítani, a változtatást a Mac OS X automatikusan kezeli a következő ébredezésnél vagy a manuálisan kiadott indítási folyamatnál. Ahhoz, hogy egy Indítóelemet hozzál létre, alkotnod kell egy futtatható állományt és egy tulajdonságlistát, ami az egymásra épüléseket tartalmazza. És kész, nem kell szkripteket írni, futtatni, se tesztelni.

Indítóelemek kontra Bejelentkezési elemek

A Mac OS X számos lehetőséget kínál fel programok bejelentkezésekor vagy ébredezéskor történő futtatására. Ezek az Indítóelemek, Bejelentkezési elemek és a shell indító szkriptek (ezek a Terminál vagy az X11 futtatásakor kerülnek végrehajtásra). Mindegyiknek megvan a maga előnye, hátránya és a megfelelő alkalmazási köre. Az Indító- és a Bejelentkezési elemek közti különbség a legmegtévesztőbb, hiszen egyfelhasználós gép volt a Mac sokáig.

Alapvetően négy dologban különböznek egymástól:

Indítóelemek Bejelentkezési elemek
Egymásra épülés? van, feltételekkel nincs
Mikor futnak? ébredezéskor a felhasználó bejelentkezésekor
Kinek a jogaival futnak? root joggal, de nem szükségképpen a bejelentkező felhasználó jogaival
Milyen típusú processzek futtathatóak? háttérben futó és futás után kilépő programok bármely Mac OS X alatt futtatható állomány végrehajtható


Az Apache Indítóelem A Mac OS X két helyen néz Indítóelemek után: > System > Library > StartupItems és > Library > StartupItems, alapestben nincs is ilyen mappa a > Libraryben, neked kell manuálisan létrehozni. Minden Indítóelem egyenjogúnak van tekintve a sorrend megállapításánál, de a > System mappa a rendszerelemek számára van fenntartva. Valójában az alapértelmezett Indítóelemek futtatása meg kell hogy előzze az általad definiált Indítóelemeket, mert az előzőek olyan általános szolgáltatásokat nyújtanak, mint összeomlás-jelentő, a Grafikus szolgáltatások és a Felhasználókat menedzselő rendszer.

Egy ilyen Indítóelem, az Apache webszerver indítására szolgál, amely a Személyes hálózati megosztást és az FTP szolgáltatásokat teszi lehetővé. A > System > Library > StartupItems mappa tartalmaz egy Apache nevű mappát, ami fájlokat tartalmaz, amire szükséged van, ha az Apache szervert indításkor futtatni szeretnéd. Lássuk, mik is ezek a fájlok: az Apache Indítóelem futtatható állománya: Apache, egy XML fájl: StartupParameters.plist (Indítási jellemzők) és egy könyvtár: Resources (Készletek) névvel.

A Resources mappában lokalizációval kapcsolatos fájlok vannak, az English.lproj az amerikai angol nyelvű szövegeket tartalmazza, a StartupParameters.plist és az Apache a két alapvető fájl az Indítóelem szempontjából.

A Jellemző lista

A StartupParameters.plist az adott Indítóelemre jellemző bejegyzéseket tartalmaz, amelyek az Apache futtatásához szükségesek. Ennek a listának az almappa gyökerében kell lennie, a következők találhatóak meg benne XML formátumban:
{
   Description = "Apache web server";
   Provides = ("Web Server");
   Requires = ("DirectoryServices");
   Uses = ("Disks", "NFS");
   OrderPreference = "None";
}


A Leírás (Description) leírást ad a szolgáltatásról, csak a fájl leírására szolgál, nem az indításkor kijelzett információ.

A Szolgáltat (Provides) határozza meg az Indítóelem által adott szolgáltatást. Lehetnek többes bejegyzések is, de ez nem ajánlott. Itt az Apache egy "Web Szerver" szolgáltatást ad, más Indítóelemek és a SystemStarter is ezen a néven keresztül éri el a szolgáltatást.

A Feltétel (Requires) határozza azt a szolgáltatást vagy szolgáltatásokat, amelyet vagy amelyeket el kell indítani, mielőtt ez az elem elindulna. Az itt szereplő értékek a szükséges Indítóelemek Szolgáltat (Provides) mezőjében szereplő nevek. Az Apache szervernek szüksége van a sikeresen lefutott Kötet Szolgáltatások (Directory Services) Indítóelemre, ha sikertelen a betöltése vagy a végrehajtása, az Apache nem fog futni.

A Használ (Uses) azokat az Indítóelemeket sorolja fel, amelyeket ajánlott az adott Indítóelem betöltése előtt elindítani. Hasonlít a Feltételben megadottakra, azon különbséggel, hogy a szolgáltatás mindig be lesz töltve, de csak akkor, mielőtt megpróbálta a Használ mezőben lévő elemeket betölteni. Az Apache használja a Lemezek (Disks) és a Hálózati fájlrendszer (NFS) szolgáltatásokat. Az OS X megpróbálja ezeket a szolgáltatásokat betölteni, ha sikertelen, az Apache mégis betöltésre kerül, de kísérletet tesz az előbbiek betöltésükre.

A Sorrend kedvezmény (OrderPreference) egy általános időszakaszt határoz meg, amikor az adott Indítóelemet el kell indítani. Ez a sorrend kevésbé jelentős, mint a Feltétel vagy a Használ, de ezen jellemzők kiértékelése után, ennek alapján van a kiértékelés eldöntve. A lehetséges értékek az Első (First), Korán (Early), Nincs (None) - ez az alapértelmezett - Későn (Late), Utolsó (Last). Itt nincs meghatározva, hogy az Apache milyen Sorrend kedvezményben részesüljön.

A futtatható állomány

A második fájl az Indítóelem könyvtárában az Apache névre hallgat, és futtatható állomány - shell szkript - , amit az OS X az indítás folyamán végrehajt. Az első dolog, amit észrevehetsz, hogy az Indítóelem mappájának és a futtatható állománynak is ugyanaz a neve. Az Indítóelem meghatározása megköveteli, hogy a futtatható állomány és az azt tartalmazó mappa neve megegyezzen és a futtatható állománynak az almappa gyökerében kell lennie.

Nézzük meg, mit rejt a shell szkript: #!/bin/sh

##
# Apache HTTP Server
##

. /etc/rc.common

StartService ()
{
   if [ "${WEBSERVER:=-NO-}" = "-YES-" ]; then
      ConsoleMessage "Starting Apache web server"
      apachectl start
   fi
}

StopService ()
{
   ConsoleMessage "Stopping Apache web server"
   apachectl stop
}

RestartService ()
{
   if [ "${WEBSERVER:=-NO-}" = "-YES-" ]; then
      ConsoleMessage "Restarting Apache web server"
      apachectl restart
   else
   StopService
   fi
}

RunService "$1"


Az első sor megmondja az értelmezőnek, hogy a Bourne Again Shellt használja a parancsok kiértékelésekor. A következő pár hashmarkkal (#) kezdődő sor megjegyzés, az értelmezésben segít, illetve közli, hogy az Apache HTTP szerverrel van dolgunk, a parancsértelmező figyelmen kívül hagyja a kiértékeléskor. A következő sor betölti az rc.common állományt, ami egy Apple által készített hasznos rutinokat tartalmaz egy szkript formájában, amelyek a segédváltozók kiértékelésében használhatóak. Egy ilyen függvény a RunService(). Ha egy változót adunk át neki meghívásakor, akkor a 'VáltozóNeve'Service függvényt hívja meg, pl. a
RunService "menj";
parancs a menjService() függvényt. A RunService függvény használatával egyszerűen a parancssorban használt változókkal különböző bemeneti paraméterekkel megadott, egymástól különböző függvényeket lehetséges meghívni egy szkriptben. Ha megnézed az Apache állományt, a RunService "$1" sorban a "$1" a legelső szkriptnek átadott argumentumot jelenti, így ez a parancs a szkriptnek az első átadott argumentum által megadott függvényt fogja meghívni.

Az Indítóelemben használt futtatható állománynak tehát képesnek kell lennie egyetlen argumentum fogadására, ami az alábbi 3 értéket veheti fel: start, stop vagy restart. Ez teszi lehetővé a SystemStarter programon keresztül az adott szolgáltatás szükség szerinti elindítását, megállítását vagy újraindítását, akár az indítás alatt, akár a parancssorból.

Ahhoz, hogy a három argumentum értelmes legyen, az Apache három függvénnyel rendelkezik, amelyeknek a nevei passzolnak az átadott értékekhez, ezek a StartService, a StopService és a RestartService. Azt teszik, amit a nevük is elárul, az adott futtatható állománnyal megadott szolgáltatást elindítják, megállítják vagy éppenséggel újraindítják. Ha saját Indítóelemet akarsz létrehozni, nem kell mást tenned, mint bemásolni a StartService, StopService és a RestartService függvényekbe azt a megfelelő shell kódot, amely a te futtatni kívánt programodat vagy szolgáltatásodat vezérli. Természetesen, bármely program, amely képes a start, stop és restart argumentumokat értelmezni, lehet Indítóelem.

Minden függvény hívást intéz a "ConsoleMessage" küldőhöz, amely üzenetek ad át a SystemStarter programnak. A ConsoleMessage az adott értékeket kiírja az OS X indításakor megjelenő üzeneteket kiíró ablakra.

Saját Indítóelem készítése

Most hogy ismered az Indítóelemek felépítését, készíthetsz egyet magadnak. Elsőként hozz létre egy könyvtárat, és nevezd el a szolgáltatásod nevére. Most a Tomcat szervlet motornak készítünk egyet, legyen a könyvtár neve tehát Tomcat. A Tomcat nem része a Mac OS X rendszernek, le kell tölteni. A VersionTracker weboldalon, a Mac OS X szekcióban, ha rákeresel a "Complete Tomcat 4.1.24" névre, kidob egy csomagot, töltsd le, mountold fel az imázst, majd telepítsd:
# installer -pkg /Volumes/Jakarta\ Tomcat/Tomcat.pkg -target/

Készít magának egy Indítóelemet, azt helyezd át biztonsági mentésnek a Saját mappádba:
# mkdir ~/Tomcat;cp /Library/StartupItems/Tomcat/* ~/Tomcat/

Ha elakadnál, ezzel nyugodtan írd felül a tiédet:
# cp ~/Tomcat/* /Library/StartupItems/Tomcat/

A következő lépés az Indítási jellemzők és a futtatható állomány megadása. A legegyszerűbb, ha átmásoljuk az Apache Indítóelemben találhatóakat. (ez két hosszú utasítás sor!)
# cp /System/Library/StartupItems/Apache/*
   /Library/StartupItems/Tomcat/
# mv /Library/StartupItems/Tomcat/Apache
   /Library/StartupItems/Tomcat/Tomcat


Ha ez kész, szerkesztenünk kell őket, hogy ne az Apache induljon el. Elsőnek a StartupParameters.plist:
# pico /Library/StartupItems/Tomcat/StartupParameters.plist

{
   Description = "Tomcat Servlet Engine";
   Provides = ("Tomcat");
   Requires = ("Disks", "Resolver", "Web Server");
   Uses = ("NFS","Network Time");
   OrderPreference = "None";
}


A Leírás (Deszkription): "Tomcat Servlet Engine", Szolgáltat (Provides): "Servlet Engine", Feltétel (Requires): "Disks", "Resolver" és "Web Server", Használ (Uses): "NFS", "Network Time", és nincs külön sorrend meghatározva. Ha a Tomcatre akarsz hivatkozni, akkor a "Tomcat" sort kell használnod.

A következő mozzanat a Tomcat szkript szerkesztése. Ehhez tudni kell, hogy maga a Tomcat Szervlet motor hol található. A telepítés után a > Library > Tomcat mappába kerültek a fájlok, ezt mentsd el egy TOMCAT_HOME változóba, így ha át kell mozgatnod a mappát, csak egy helyen kell módosítanod a szkriptet. Az indításhoz és a megállításhoz shell szkripteket használ, amelyek a > bin almappában találhatóak, startup.sh és shutdown.sh névvel. Mindkettőnek szüksége van a Java könyvtár elérési útvonalára, amit egy JAVA_HOME változóban tárolhatunk a szkripteken belül, ide az alapértelmezett át a > Library > Java > Home.

A Tomcat szkript szerkesztése során öt dolgot kell változtatnunk.

# pico /Library/StartupItems/Tomcat/Tomcat

Először a fájl kezdetén a megjegyzést kell módosítani, a szolgáltatásnak megfelelően. Majd a három státuszváltoztató függvényeket kell szerkeszteni, hogy a SystemStarter programon keresztül vezérelni tudjad a Tomcat motort, végül pedig be kell állítani a JAVA_HOME környezeti változót, mielőtt a RunService függvény meghívódna.

A változtatások után így nézhet ki a szerkesztett fájl.

#!/bin/sh

##
# Tomcat Servlet Engine Start
##

. /etc/rc.common

TOMCAT_HOME="/Library/Tomcat"
JAVA_HOME="/Library/Java/Home"

StartService ()
{
   ConsoleMessage "Starting Tomcat Servlet Engine"
   $TOMCAT_HOME/bin/startőtomcat.sh & 
}

StopService ()
{
   ConsoleMessage "Stopping Tomcat Servlet Engine"
   $TOMCAT_HOME/bin/stopőtomcat.sh & 
}

RestartService ()
{
   ConsoleMessage "Restarting Tomcat Servlet Engine"
   StopService
   StartService
}

RunService "$1"


Ha végeztél a módosításokkal, ideje kipróbálni. Nem kell újraindítani a gépet, hiszen a SystemStarter programmal magad is elindíthatod, emlékezz, hogy Tomcat a név, amelyen keresztül eléred a szolgáltatást:
# systemstarter start Tomcat
Welcome to Macintosh.
Starting SecurityServer
Initializing network
Checking disks
net: class is not implemented
ip6: error detaching en0
ip6: error detaching fw0
Starting Tomcat Servlet Engine
Startup complete.
Hangup
# Using CATALINA_BASE:   /Library/Tomcat
Using CATALINA_HOME:   /Library/Tomcat
Using CATALINA_TMPDIR:   /Library/Tomcat/temp
Using JAVA_HOME:   /Library/Java/Home


Látható, hogy a szükséges szolgáltatásokon végigmegy, mielőtt elindítaná a Tomcat motort. A böngésződben nézd meg a http://localhost:8080/ címet. A Tomcat a 8080-as portot használja alapbeállításként. A következő oldal köszönthet.

Kattints már rám! Gratulálok, készen vagy! Ha összehasonlítod az általad készített Indítóelem fájlokat a telepítő által bemásoltakkal, a nevekben és a változó nevében találhatsz eltérést, de az a működést nem befolyásolja.

Az Indítóelemek nagyon hasznosak, és egyszerűen teszik lehetővé a rendszer tulajdonságainak a bővítését. Ha valami problémába ütköznél, nyugodtan helyezd át az adott Indítóelemet a StartupItems mappából, és másold be a biztonsági mentést!

Ha kérdésed vagy problémád van írj bátran!


Mátyás Ferenc Farkas


A lap tetejére