launchd und Konfigurationsänderungen

maceis

Aktives Mitglied
Thread Starter
Dabei seit
24.09.2003
Beiträge
16.880
Reaktionspunkte
626
Hallo zusammen,

laut Apple soll launchd ja unter anderem dafür sorgen, dass man Services nach konfigurationsänderungen nicht neu starten muss.

Allerdings habe ich keine Hinweise darauf gefunden, wie das funktionieren soll. Es gibt zwar Möglichkeiten das selbst nachzubilden (z.B. mit WatchPaths), mich würde aber interessieren, wie das eigentlich gedacht ist buw. funktionieren soll.

In den einschlägigen man pages und bei google bin ich leider nicht fündig geworden. Habt Ihr eine Ahnung, wie das funktionieren soll?

Danke und Gruß
maceis
 
Zuletzt bearbeitet von einem Moderator:
launchd ist im Bezug auf solche Dinge glaube ich noch eine Baustelle! Wobei der Service heir ja auch mitspielen muß, er muß dann ja seine Konfiguration ja regelmäßig prüfen. Samba tut so etwas eine httpd z.B. nicht.

Launchd fehlen ja aber auch noch Angaben wie etwa auszuführende Aktionen beim herunterfahren eines Systemes. DBs könnten ganz dankbar sein wenn sie regulär beendet werden und nicht schlicht gekillt!

Ich denke auch Deine Frage zielt in eine Richtung wo bei den Programmieren ein

// @TODO

im Sourcecode steht ;)
 
launchd ist ja unter Anderem dafür zuständig, dass ein Dienst nur dann gestartet wird, wenn dieser gebraucht wird. Z.b. FTP. Während einer aktiven FTP-Sitzung werden die Änderungen an der Konfiguration nicht wirksam, log ich mich aus und starte eine neue Sitzung werden die Änderungen wirksam da der Dienst ja neu gestartet wird.
Vielleicht versteh ich aber auch deine Frage nicht ganz..
lg
 
Apple verkauft das so, als wäre das in Leopard schon implementiert, wegus.

Was das saubere Beenden angeht, dass Du ansprichst, geht die Philosophie wohl dahin, dass ein Dienst so programmiert werden soll, dass keine Grundannahmen oder Voraussetzungen (oder zumindest so wenige wie möglich) für das ordnungsgemäße Funktionieren gegeben sein sollen.

Das finde ich auch grundsätzlich einen richtigen Ansatz. Für Dein Beispiel DBs würde das bedeuten, dass eine DB auch dann sauber funktionieren muss, wenn Sie kalt abgeschossen wird.

Dieses ganze Gestrüpp mit den rc Dateien, den inetd Geschichten und selbst SystemStarter etc. wo ein Dienst nur dann richtig startet, wenn er nach diesem und vor jenem anderen Dienst gestartet wird ist doch eine einzige Belastung. Unvermeidliche Abhängigkeiten können und sollen auf einer anderen Ebene abgefrühstückt werden.


Dass Konfigurationsänderungen selbständig erkannt werden, soll nicht nur bei OnDemand Daemons so sein, ente. Ich bin mir auch gar nicht sicher, dass die Konfiguration neu eingelesen wird, wenn ein Service nur mit OnDemand gestartete wird.
 
Also, wenn ich das richtig verstanden habe, besteht ein Launchd-Daemon aus zwei Dingen: 1. eine .plist, die angibt, was er braucht und will (Resourcen, Pfade, Rechte, Lebensdauer etc.) und halt 2. dem Daemon selbst.

Launchd behält die volle Kontrolle: Er weiß, wann der Daemon starten muss, und ob er nach seinem Tod erneut gestartet werden muss. Ändert sich irgendwas an der .plist des Deamons oder an den Umständen (Resourcen), so kann der Deamon aufgerufen, geSIGHUPed oder gekillt(?) werden.

Ziemlich gut erklärt ist das alles (außer bei Apple-Developerdings) hier in dem verlinkten Google-Video.

EDIT: Ja super, das Video hast Du ja oben schon verlinkt. Dann hilft Dir die Apple-Seite vermutlich auch nicht weiter.
Und ich verstehe nicht mehr, was eigentlich Deine Frage war. Launchd ist einfach das Daemon-MasterControlProgram.
 
Zuletzt bearbeitet:
Die Frage ist:
Was muss ich machen, damit launchd Änderungen an den kontrollierten Daemons selbständig bemerkt und ich nicht nach eine Konfigurationsänderung wie ehedem den Daemon "von Hand" neu starten muss.

Beispiel 1 - apache2:
Ich füge eine Datei in einem Verzeichnis hinzu, in der vhost Definitionen liegen, die von httpd.conf inkludiert werden. Derzeit muss ich immer noch ein "sudo apachectl graceful" absetzen, damit die Konfigurationsänderung wirksam wird. Was muss man machen, dass launchd die Konfigurationsänderung bemerkt und selbst alles nötige veranlasst?

Beispiel 2 - BIND:
Ich ändere eine Zonendatei. Derzeit muss ich immer noch mit rndc dafür sorgen, dass die Änderung vom Server übernommen wird. Was muss ich machen, damit launchd sowohl Änderungen in den Zonendateien als auch in der named.conf bemerkt und dafür sorgt, dass BIND die Änderungen übernimmt?
 
hab das video gerade mal überflogen...
kann es sein, dass es diese KeepAlive PathState geschichte ist? (so ab 30 minuten im vortrag)
fehlt aber irgendwie in der man page auf meinem system, findet sich aber in der online man page...
 
Zuletzt bearbeitet:
Nein, ich denke das ist etwas anderes. Damit können sich mehrere Prozesse gegenseitig beeinflussen. Z.B. ein Prozess löscht unter bestimmten Bedingungen die entsprechende Datei und beendet sich. Das löst den Start eines anderen Prozesses aus, der die Bedingungen korrigiert und die Datei neu erstellt. Dies wiederum löst den Neustart des ersten Prozesses aus usw. Beispielsweise könnte so ein Prozess daran geknüpft werden, ob ein pid File eines Server vorhanden ist (oder ein socket) oder ob ein bestimmtes Volume gemountet ist. Alarm System u.ä. wären vorstellbar.

Bei mir steht das mit "KeepAlive "PathState" und übrigens auch in der lokalen manpage.
 
im dem video wird bei PathState noch über den start philosophiert, wenn ein config file vorhanden ist oder nicht...
dann bleibt nur noch WatchPaths...
 
Ja, sicher, aber man kann sich ja vieles vorstellen.
Wer z.B. den Apachen nur laufen hat, um auf MySQl Datenbanken zuzugreifen, der kann ja z.B. dafür sorgen, dass der Apache sich verabschiedet, wenn der mysql Socket weg ist. Man kann sich auch einen Daemon vorstellen, der in solchen Fällen eine Email (oder SMS) an den Administrator schickt.

Wenn das wirklich nur über "WatchPaths" läuft, dann finde ich die im Video zu Anfang abgegebenen Erklärungen zu dick aufgetragen. Bisher habe ich aber nirgends konkrete Info gefunden.
 
mission statement/design goals ;)

frag doch auf launchd-dev...
 
Ich frage mich, wie denn launchd wissen soll, wo x-beliebige Applikationen ihre Configs ablegen ohne den Quelltext zu haben.
Das ganze vielleicht mit ptrace zu machen, wäre doch eher Wahnsinn. Ich denke auch, daß es noch Zukunftsmusik ist.
Andererseits meinen die vielleicht nur die zum Dienst zugehörige plist für launchd.
 
… meinen die vielleicht nur die zum Dienst zugehörige plist für launchd.

Streiche "vielleicht", füge "sicher" ein.

… dafür sorgen, dass der Apache sich verabschiedet, wenn der mysql Socket weg ist …
Launchd beendet eigentlich keine Prozesse. Einzig, wenn ein verwalteter Dämon oder Agent nach seinem Exit hängen bleibt, dann leistet launchd nach einstellbarem Intervall Sterbehilfe.
 
Zuletzt bearbeitet:
mission statement/design goals ;)
Sieht so aus. Verkauft wird es aber, als wäre es schon längst implementiert.
frag doch auf launchd-dev...
Werd ich wohl gelegentlich machen. Dann kann ich auch gleich danach fragen. Einen Bugreport dafür habe ich schon gepostet.

Ich frage mich, wie denn launchd wissen soll, wo x-beliebige Applikationen ihre Configs ablegen ohne den Quelltext zu haben.
...
Ich glaube Du denkst zu kompliziert. Nachdem das BS ohnehin sämtliche Zugriffe auf die Ressourcen verwaltet, besteht kein Grund, warum launchd diese Informationen nicht verwenden soll. Schlimmstenfalls muss man halt property keys einführen wo man Dateien und Verzeichnisse angeben kann, die überwacht werden müssen. Der Code dafür ist in launchd schon da.
Streiche "vielleicht", füge "sicher" ein.
Nein, denn launchd reagiert auch nicht selbständig auf Änderungen in den plist files. Außerdem wird es von Apple völlig anders beschrieben.
Launchd beendet eigentlich keine Prozesse. Einzig, wenn ein verwalteter Dämon oder Agent nach seinem Exit hängen bleibt, dann leistet launchd nach einstellbarem Intervall Sterbehilfe.
Auch nicht richtig. launchd beendet Prozesse, bei denen OnDemand auf true steht nach einer gewissen Zeit. Die "KeepAlive" Anweisung erweitert dieses Verhalten.
 
… als wäre es schon längst implementiert.
Der Quellcode von launchd ist verfügbar hier:
http://www.opensource.apple.com/darwinsource/10.5.5/launchd-258.18/
und hier:
http://launchd.macosforge.org/
Man könnte also nachschauen ;-)

Die Jungs von FreeBSD arbeiten anscheinend an der Integration von launchd in FreeBSD:
http://wiki.freebsd.org/launchd

… launchd reagiert auch nicht selbständig auf Änderungen in den plist files.…

Es reagiert selbständig auf die Bedingungen seiner plist-Dateien, beispielsweise Anfragen auf definierten Ports oder Existenz und Nicht-Existenz von angegebenen Pfaden et cetera.

… launchd beendet Prozesse, bei denen OnDemand auf true steht nach einer gewissen Zeit. Die "KeepAlive" Anweisung erweitert dieses Verhalten.

Wo steht das? Die Quelle will ich sehen. Und stell sicher, daß "*.apple.com" vorne steht.

OnDemand beendet keine Prozesse. Es startet sie nur nach Bedarf. Sie beenden sich selbst, wenn sie wollen. OnDemand ist deprecated und ersetzt durch KeepAlive, was ebenfalls nach Bedarf Dinge startet und nur dafür sorgt, daß ein Prozeß unter bestimmten Bedingungen am Laufen bleibt also erneut gestartet wird.

Siehe "man launchd.plist".

PS: Was soll "Vim7.0 auf Mac OS X installieren" in Deiner Signatur?
Code:
KeyWest:~ macmark$ vim --version
VIM - Vi IMproved 7.2 (2008 Aug 9, compiled Sep 25 2008 19:37:57)
Included patches: 1-22
Compiled by nobody@b69.apple.com
 
Zuletzt bearbeitet:
Ich habe mich vor geraumer Zeit mal durchs launchd-core gezwickt und nix Konkretes diesbezüglich gelesen (außer WatchPaths/Ging damals um Dienste beenden, was auch "Kackomat" behandelt wird.). Schliesse mich insofern MacMark an.
Das ist wohl noch ein Zukunfts-Goldenes-Ei (bin aber wohl eher der Delphi-Fuzzi, der's nicht kapiert, was in Obj-C so geht).
 
Zuletzt bearbeitet:
Launchd hat nichts mit Objective-C zu tun. Launchd startet jede beliebige ausführbare Datei: Shellskript, Python, C, Objective-C – völlig egal.
WatchPaths ist eine Option, die dafür sorgt, daß das Programm gestartet wird, wenn sich einer der genannten Pfade verändert. Auch hier findet sich nichts mit Beenden.

Er trägt nicht ohne Grund "launch" im Namen und nicht "kill", was es ja bereits gibt. Er startet Prozesse bei Bedarf, wobei "Bedarf" sehr unterschiedlich in den plists definiert werden kann.
Außer der Sterbehilfe nach einem Timeout für ein nicht geklapptes normales Selbstbeenden eines gestarteten Prozesses, beendet launchd nichts.
 
...
OnDemand ist deprecated und ersetzt durch KeepAlive, was ebenfalls nach Bedarf Dinge startet
Ja, so deprecated, dass Apple es auch in 10.5.5 noch fast so oft verwendet wie KeepAlive (23 vs. 28). :D.

Wie dem auch sei.
Auch wenn Du in einige (nicht allen) Punkten wohl Recht hast, trägt die Aufforderung den Quelltext zu lesen recht wenig zur Diskussion bei. Dass man die manpages lesen soll ist ja in Ordnung. Dass man aber den Quelltext lesen muss, um ein Werkzeug zu benutzen, geht zu weit ;).

Und unter "No restarting applications or the computer after configuration changes" verstehe ich persönlich was anderes als
...
Es reagiert selbständig auf die Bedingungen seiner plist-Dateien, ...
Ich weiß nicht, wo Du hier "configuration changes" siehst.
 
Ja, so deprecated …
OnDemand <boolean>
This key was used in Mac OS X 10.4 to control whether a job was kept alive or not. The default was true. This key has been deprecated and
replaced in Mac OS X 10.5 with the more powerful KeepAlive option.
man launchd.plist

Deprecated heißt nicht "verboten", sondern für neuen Code nicht mehr verwenden und im alten Colde gelegentlich möglichst ersetzen.

… Dass man aber den Quelltext lesen muss, um ein Werkzeug zu benutzen, geht zu weit ;).
Es ging mir nicht ums Verstehen, sondern ums Nachprüfen, ob etwas implementiert ist oder nicht. Ihr hatte darüber spekuliert. Ich wollte damit sagen: Ich braucht nicht zu spekulieren, wenn Ihr nachsehen könnt.

Fürs Verstehen genügen die manpages zu launchd, launchd.plist und launchctl.

Und unter "No restarting applications or the computer after configuration changes" verstehe ich persönlich was anderes als
Zitat von MacMark
... Es reagiert selbständig auf die Bedingungen seiner plist-Dateien, ...
Ich weiß nicht, wo Du hier "configuration changes" siehst.
Die plist-Dateien, in denen das Verhalten der Launch-Daemons und -Agents definiert wird, wann und unter welchen Bedingungen was gestartet wird, konfigurieren das Verhalten von Launchd.
Du mußt Launchd oder den Mac nicht neu starten, damit Launchd Änderungen in seinen Konfigurationsdateien erkennt und umsetzt. Mit launchctl kannst Du beispielsweise manuell Konfigurationsdateien laden und entladen wie ich hier beschreibe:
http://www.macmark.de/osx_launchd.php#launchctl
 
Du brauchst nicht fortwährend die man pages zu zitieren. Wie ich bereits in #1 erwähnte, habe ich sie gelesen ;) und ich weiß sogar, was "deprecated" bedeutet ;).
Auch sind mir 'launchctl load/unload' geläufig. Darum geht es hier aber nicht.
...
Mit launchctl kannst Du beispielsweise manuell Konfigurationsdateien laden und entladen
...
Ja, manuell, wie vor 30 Jahren :stöhn:

Nun gut. Offensichtlich hat Apple bei mir doch etwas zu hohe Erwartungen geweckt ;).
 
Zurück
Oben Unten