Wie verknüpfe ich eine launchd 2-Plist mit ihren Domänen- und Dienstzielen?

Was genau sind diese "Domänen" und "Dienstziele" und wie verknüpfe ich sie mit plists zur Verwendung durch launchd?

OS X 10.10 führt eine neue launchctlAPI zum Verwalten von LaunchDaemons und zum Starten von Plists ein. Protokollmeldungen und Handbuchseiten weisen darauf hin, dass Schlüssel wie KeepAliveund RunAtLoadnicht mehr verwendet werden sollten und dass Unterbefehle enable; bootstrap; und kickstartsollte vor load -wund verwendet werdenunload -w

Aus den Manpages geht jedoch nicht hervor, wie eine Plist mit der "Domäne" und dem "Dienstziel" verknüpft werden soll, über die es spricht, und ohne die diese Befehle nicht mit vorhandenen Plists verwendet werden können, die für OS X 10.9 anscheinend völlig ausreichend waren

Zum Beispiel [aktualisiert]: Eine grundlegende Plist, die wir zu "starten" versuchen; anscheinend in die Domäne "system" gebootstrapped, aber anschließend nicht in "system" erkannt

# pwd
/Library/LaunchDaemons
# cat com.iainhouston.django.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
<dict>
     <key>Label</key>
     <string>com.iainhouston.django</string>
     <key>ProgramArguments</key>
     <array>
          <string>/usr/local/virtualenvs/django.iainhouston.com/bin/gunicorn</string>
          <string>--bind=127.0.0.1:49202</string>
          <string>--workers=2</string>
          <string>superlists.wsgi:application</string>
     </array>
     <key>Disabled</key><false/>
</dict>
</plist> 
# launchctl bootstrap system com.iainhouston.django.plist
/Library/LaunchDaemons/com.iainhouston.django.plist: Service is disabled 
# launchctl enable system/com.iainhouston.django.plist 
# launchctl kickstart system/com.iainhouston.django.plist
Could not find service "com.iainhouston.django.plist" in domain for system  

Motivation

Das Systemprotokoll zeichnet auf, wenn launchctl -w load ...wir diesen Dienst verwenden . Dieser Dienst ist so definiert, dass er ständig ausgeführt wird und von Natur aus ineffizient ist. Daher sind wir motiviert, die neue Schnittstelle zu verwenden. Nicht nur das, wir haben erhebliche Probleme mit übermäßiger Prozessorauslastung, die wir kontrollieren wollen, indem wir die entsprechenden On-Demand-Schlüsselwörter bereitstellen, also sind wir wieder motiviert zu verstehen, wie man mit dem neuen launchd interagiert ... nicht einfach mit den Dokumenten wie sie stehen!KeepAliveRunAtLoad

Antworten (2)

Wenn möglich, melden Sie einen Fehler bei Apple bezüglich unvollständiger oder unklarer Dokumentation.

launchdscheint für OS X 10.10 neu geschrieben worden zu sein und ist wahrscheinlich noch für einige kleinere Versionen im Fluss.

Domänen und Dienstziele scheinen eine Abstraktion der verschiedenen Ordner zu sein, die für launchd-Jobtickets verfügbar sind. Sie ermöglichen auch, dass launchctl-Befehle auf bestimmte Sitzungen abzielen; eine Funktion, die es einem launchctl-Befehl ermöglichen sollte, andere Benutzersitzungen zu beeinflussen.

Ab OS X 10.10.1 erwähnt die launchd.plistManpage jedoch weder veraltet KeepAlivenoch RunAtLoadSchlüssel.

Apple schlägt vor, zu vermeiden, KeepAliveund RunAtLoadweil die Absicht darin besteht, zu vermeiden, dass jemals ein Prozess ohne eine Garantie für die zu erledigende Arbeit gestartet wird. Beide Tasten bleiben erhalten und werden für viele Aufgaben benötigt.

Das beste Referenzdokument bleibt Technical Note TN2083, Daemons and Agents . Dieses Dokument bietet einen großartigen Einblick in launchd und die Absichten von Apple, wie Hintergrundprozesse implementiert werden sollten.

Ja, ich werde einen Fehlerbericht einreichen. Natürlich habe ich mich an TN2083 gewandt, bevor ich diese Frage gepostet habe, aber sie ist so veraltet: Sie wurde zuletzt im November 2007 aktualisiert! Die Web-Manpages für Entwickler befinden sich unter 10.9 und verweisen Sie auf Manpages auf Ihrem Yosemite-System. Dort sehen Sie die Diskussion über KeepAlive- und RunAtLoad-Schlüssel. Es ist nicht so, dass sie veraltet sind, aber im Fall von RunAtLoad: "Dieser Schlüssel sollte vermieden werden, da spekulative Jobstarts negative Auswirkungen auf Systemstart- und Benutzeranmeldeszenarien haben." Es gibt jedoch keine beispielhaften Jobtypen oder Anwendungsvorschläge. Sehr unbefriedigend.
Fehler 1915644 erstellt.
Glücklicherweise RunAtLoadund KeepAlivebleiben, aber es wird einfach davon abgeraten. Einige Aufgaben erfordern diese Verhaltensweisen, aber wo immer möglich möchte Apple, dass Ingenieure den Standardansatz überdenken. Eher ein Anstupser als ein Absolutes. Vielen Dank, dass Sie den Fehler gemeldet und zur Kenntnis genommen haben.
Ich habe nicht das Gefühl, dass ich nur meine Zwangsstörung ausübe! OK, die Manpage stupst an, aber das Protokoll beschwert sich jetzt, wenn wir Folgendes verwenden KeepAlive: RunAtLoad"Dieser Dienst ist so definiert, dass er ständig ausgeführt wird und von Natur aus ineffizient ist." Daher sind wir motiviert, die neue Schnittstelle zu verwenden. Nicht nur das, wir haben Probleme mit übermäßiger Prozessorauslastung, die wir kontrollieren wollen, indem wir die entsprechenden On-Demand-Schlüsselwörter bereitstellen, also sind wir wieder motiviert zu verstehen, wie man mit dem neuen launchd interagiert .... nicht einfach mit den Dokumenten wie Sie stehen.

Sie sind nah dran, aber Sie sollten den .plist-Teil nicht in den Befehlen enable und kickstart haben. Hier ist ein Code, den wir verwenden, um ihn einer Domäne und einem Dienstziel für einen Benutzer zuzuordnen. $UID ist im Grunde Ihre Benutzer-ID.

launchctl bootstrap gui/$UID /Library/LaunchAgents/com.yourcompany.yourapp.plist
launchctl enable gui/$UID/com.yourcompany.yourapp
launchctl kickstart -k gui/$UID/com.yourcompany.yourapp
Ein Schritt weiter, aber ... was tun Sie, um den Kickstart-Daemon zu "entladen"? unbootstrapnoch nicht implementiert; stopund disablescheinen keine Wirkung zu haben und killerkennt weder SIGTERMnoch SIGKILL....
Sie würden einfach einen Stopp machen (was den Prozess beenden sollte) und die Plist-Datei entfernen, richtig?
Sollte - tut es aber nicht (siehe meinen vorherigen Kommentar). Probieren Sie es aus und sehen Sie, was Sie bekommen. Eindeutig neue API noch nicht vollständig implementiert und zu vermeiden.