[[:mac|{{ :Apple.png?40|}}]]
===== Start-Skript erstellen (launchd) =====
==== launchd Startskripte ====
Viele Dienste wurden bisher als StartupItems konzipiert und über den SystemStarter-Prozess aus /Library/StartupItems bzw /System/Library/StartupItems heraus gestartet. Das wird zum einem möglicherweise dadurch begründet, dass Dienste uU in Abhängigkeit eines anderen Dienstes oder Prozesses stehen (Abhängigkeiten werden von launchd nicht ausgewertet und berücksichtigt); und zum anderen dadurch, dass manche Services eine ausgewiesene Shutdown Routine erwarten, welche über die StopService() Anweisung im StartupItem Skript definiert wird (was ebenfalls von launchd nicht unterstützt wird). Kritiker bemängeln, dass launchd zu sehr im Hinblick auf Ausführungsgeschwindigkeit und zu wenig mit dem Ziel der Korrektheit und Flexibilität entwickelt wurde. Aller Kritik zum Trotz scheint sich Apple aber für die zunehmende Verwendung von launchd entschlossen zu haben. Apple rät Entwickler und Administratoren ihre Startobjekte zukünftig über launchd statt dem SystemStarter abzuwickeln, was vermuten lässt, dass in zukünftigen Releases von Mac OS möglicherweise der Support von SystemStarter und somit den klassischen StartupItems eingestellt werden könnte.
launchd kann Dienste entweder im Benutzerkontext oder im Maschinenkontext laufen lassen. Wird ein Skript in /Library/LaunchDaemons abgelegt, wird es bereits beim Systemstart ausgeführt und der angeschlossene Dienst läuft unabhängig davon, ob ein Benutzer am System angemeldet ist oder nicht. Der Dienst läuft in diesem Fall im Root Benutzer Kontext. Wird das Skript hingegen in /Library/LaunchAgents abgelegt, wird der Dienst erst gestartet, wenn sich ein Benutzer am System anmeldet und läuft in dessen Benutzerkontext nur mit den Berechtigungen, die der User besitzt. Soll ein Dienst nur gestartet werden, wenn sich ein bestimmter Benutzer am System anmeldet, kann das Skript ~/Library/LaunchAgents Verzeichnis im Home Direktory des betroffenen Users abgelegt werden. Die Launch-Verzeichnisse in /System/Library sollten nicht verwendet werden, diese sind den Systemdiensten vorbehalten. Mit dem Kommandozeilen Tool launchctl((http://developer.apple.com/Mac/library/documentation/Darwin/Reference/ManPages/man1/launchctl.1.html)) können Dienste während der Laufzeit geladen oder angehalten bzw. aktiviert und deaktiviert werden.
Der Ablageort für die launchd Start Skripte:
~/Library/LaunchAgents # → Userskript, wird ausgeführt, wenn sich $USER anmeldet. Owner = $USER
/Library/LaunchAgents # → Wird bei jedem User bei der Anmeldung ausgeführt. Owner = root
/Library/LaunchDaemons # → Wird beim Systemstart ausgeführt. Owner = root
/System/Library/LaunchAgents # → Wird vom System bei jeder Anmeldung ausgeführt. Owner = root (sollte nicht verwendet werden!)
/System/Library/LaunchDaemons # → Wird vom System bei jedem Systemstart ausgeführt. Owner = root (sollte nicht verwendet werden!)
**Ein Beispiel:**
Ich benötige zB eigene definierte Firewall Regeln, welche zB den Lizenzkeybroadcast unterbinden oder andere Netzwerkports schliessen. Dazu lege ich mir ein Shellskript an, welches diese Regeln enthält. Ich habe mir dafür das Verzeichnis /usr/local/scripts angelegt, wo ich das Shellskript ipfwrules.sh ablege. Namen sind wie Schall und Rauch -> Der Ablageort und der Name für dieses Skript ist beliebig wählbar, das Skript muss nur ausführbar sein.
#!/bin/sh
/sbin/ipfw -f add 200 deny udp from any to any 1234
/sbin/ipfw -f add 210 deny udp from any to any 2345
/sbin/ipfw -f add 220 deny udp from any to any 3456
/sbin/ipfw -f add 220 deny udp from any to any 4567
Das Skript ipfwrules.sh schliesst (exemplarisch) die UDP Ports 1234, 2345, 3456 und 4567 ein- und ausgehend. Diese Ports sind nur ein Beispiel, Sie können und sollten natürlich die Firewall Regeln Ihren Bedürfnissen anpassen. Des Weiteren benötigen wir noch ein LaunchDaemon Skript, welches wir in /Library/LaunchDaemons ablegen, damit es beim Systemstart ausgeführt wird. Ich habe die Namenskonvention von Apple mit dem Reverse DNS Identifier übernommen und benenne mein Startskript org.prontosystems.ipfw.plist.
Label
start_firewall
ProgramArguments
/usr/local/scripts/ipfwrules.sh
RunAtLoad
UserName
root
GroupName
wheel
Mit dem Kommandozeilen Utilty launchctl können wir dieses Skript nun laden und dadurch das in der plist definierte Shell Skript ausführen. Natürlich wird es auch bei jedem Systemstart ausgeführt:
dtps-mac-mini:LaunchDaemons dtp$ sudo launchctl __load__ org.prontosystems.ipfw.plist
dtps-mac-mini:LaunchDaemons dtp$
dtps-mac-mini:LaunchDaemons dtp$ sudo ipfw list <- Die aktiven ipfw-Regeln anzeigen lassen
00200 deny udp from any to any dst-port 1234
00210 deny udp from any to any dst-port 2345
00220 deny udp from any to any dst-port 3456
00220 deny udp from any to any dst-port 4567
65535 allow ip from any to any
Note: Da launchd in seiner Eigenschaft nicht explizit Dienste startet sondern Skripts ausführt, kann in diesem Zusammenhang natürlich jedes Skript ausgeführt werde, unabhängig davon, ob dabei ein Dienst gestartet wird oder nur ein Verzeichnis angelegt oder gelöscht wird, etwas kopiert oder in etwas geschrieben wird etc. Wünschen Sie von Ihrem System eine Aktion zum Systemstart, welche sich skripten lässt, ist ein launchd-Skript in /Library/LaunchDeamons die erste Wahl.
**Verwandte Artikel:**
[[:mac:launchd|-> Der launchd Prozess]]
[[:mac:schedule|-> Launchd Task Scheduler konfigurieren]]
[[:mac:boot|-> Mac OS Startsequenz 10.6]]
[[:mac:stop_script|-> Stop-Skript erstellen]]
--- //pronto 2010/05/16 21:20//
{{keywords>launchd launchdaemons lunchagents launchctl systemstarter startobjekte osx startup item}}