Wie ordne ich eine launchd 2-Liste ihren Domain- und Servicezielen zu?

7

Was genau sind diese "Domain-" und "Service-Ziele" und wie ordne ich sie Plisten zu, die von launchd verwendet werden?

OS X 10.10 führt eine neue launchctlAPI zum Verwalten von LaunchDaemons und Starten von Plists ein. Protokollnachrichten und Manpages empfehlen, Schlüssel wie KeepAliveund RunAtLoadnicht mehr zu verwenden und Unterbefehle zu verwenden enable. bootstrap; und kickstartsollten 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 kann, von denen die Befehle bei vorhandenen Plists, die für OS X 10.9 anscheinend völlig ausreichend waren, nicht verwendet werden können

Zum Beispiel [aktualisiert]: Eine grundlegende Liste, die wir versuchen zu "starten"; scheinbar in "System" -Domäne gebootet, aber anschließend in "System" nicht 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

Die System - Log - Einträge, launchctl -w load ...beschwert sich, wenn wir verwenden KeepAlivemit , RunAtLoaddass dieser Service definiert ist , ständig zu laufen und ist von Natur aus ineffizient. deshalb sind wir motiviert, die neue schnittstelle zu nutzen.
Nicht nur das, wir haben erhebliche Probleme mit übermäßiger Prozessorauslastung, die wir durch die Bereitstellung der entsprechenden On-Demand-Schlüsselwörter kontrollieren möchten. Daher sind wir auch hier motiviert zu verstehen, wie mit dem neuen launchd umgegangen wird. Dies ist mit den Dokumenten nicht einfach wie sie stehen!

iainH
quelle

Antworten:

3

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

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

Domänen und Dienstziele scheinen eine Abstraktion der verschiedenen Ordner zu sein, die für gestartete Jobtickets verfügbar sind. Sie ermöglichen auch das Starten von Befehlen, um auf bestimmte Sitzungen abzuzielen. Eine Funktion, die es einem launchctl-Befehl ermöglichen soll, andere Benutzersitzungen zu beeinflussen.

Ab OS X 10.10.1 werden in der launchd.plistManpage jedoch weder veraltete KeepAlivenoch RunAtLoadSchlüssel erwähnt.

Apple schlägt vor, dies zu vermeiden, KeepAliveund RunAtLoadweil vermieden werden soll, dass jemals ein Prozess gestartet wird, ohne dass eine Garantie für die auszuführende Arbeit besteht. Beide Schlüssel bleiben erhalten und werden für viele Aufgaben benötigt.

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

Graham Miln
quelle
Ja, ich werde einen Fehlerbericht einreichen. Natürlich habe ich mich an TN2083 gewandt, bevor ich diese Frage gestellt habe, aber sie ist so veraltet: Sie wurde zuletzt im November 2007 aktualisiert! Die Entwickler-Web-Manpages sind auf 10.9 eingestellt und verweisen auf Manpages in 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 sich nachteilig auf Systemstart- und Benutzeranmeldeszenarien auswirken." Es gibt jedoch keine Beispieljobtypen oder -vorschläge zur Verwendung. Sehr unbefriedigend.
iainH
Bug 1915644 erstellt.
iainH
Gott sei Dank RunAtLoadund KeepAlivebleib doch einfach davon abgeraten. Einige Aufgaben erfordern dieses Verhalten, aber Apple möchte, dass Ingenieure den Standardansatz nach Möglichkeit überdenken. Ein Schubser statt eines Absoluten. Vielen Dank, dass Sie den Fehler eingereicht und zur Kenntnis genommen haben.
Graham Miln
Ich habe nicht das Gefühl, dass ich nur meine Zwangsstörung ausübe! OK, die Manpage stupst, aber das Protokoll beklagt sich jetzt, wenn wir KeepAlivemit RunAtLoad"Dieser Dienst ist so definiert, dass er ständig ausgeführt wird und von Natur aus ineffizient ist." deshalb sind wir motiviert, die neue schnittstelle zu nutzen. Nicht nur das, wir haben Probleme mit übermäßiger Prozessorauslastung, die wir durch die Bereitstellung der entsprechenden On-Demand-Schlüsselwörter kontrollieren möchten. Daher sind wir auch hier motiviert zu verstehen, wie mit dem neuen launchd umgegangen wird Sie stehen.
iainH
3

Sie sind nah dran, sollten aber nicht den .plist-Teil in den Befehlen enable und kickstart haben. Hier ist ein Code, mit dem wir ihn einer Domäne und einem Dienstziel für einen Benutzer zuordnen. $ 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
Ken Aspeslagh
quelle
Einen Schritt weiter, aber was tun Sie, um den Kickstarted-Daemon zu "entladen"? unbootstrapnoch nicht implementiert; stopund disablescheinen keine Wirkung zu haben und killerkennt weder SIGTERMnoch SIGKILL....
iainH
Sie würden einfach einen Stopp durchführen (was den Prozess beenden sollte) und die plist-Datei entfernen, richtig?
Ken Aspeslagh
Sollte - aber nicht (siehe meinen vorherigen Kommentar). Probieren Sie es aus und sehen Sie, was Sie bekommen. Offensichtlich neue API noch nicht vollständig implementiert und zu vermeiden.
iainH