So starten Sie einen Dienst unter Mac OSX 'launchctl'

3

Warum wird meine Konfigurations-Plist-Datei nicht mithilfe von launchctl als Dienst geladen?

Ich verwende OSX Yosemite und habe dieses hervorragende Tutorial zur Verwendung von launchctl gelesen http://nathangrigg.net/2012/07/schedule-jobs-using-launchd/

Ich habe eine korrekte .plist-Datei mit der Konfiguration des Dienstes erstellt (ich weiß, dass dies korrekt ist, da es sich um eine fast genaue Kopie einer funktionierenden plist-Konfigurationsdatei handelt, die ich vor einigen Jahren erstellt habe). Ich tippe ein

launchctl load ~/Library/LaunchAgents/com.apple.myservice.plist

und antworte

~/Library/LaunchAgents/com.apple.myservice.plist: File exists

Das ist nicht schrecklich beschreibend, aber ich gehe und tippe

launchctl start com.apple.myservice

und es gibt keine Ausgabe und nichts passiert. Ich habe auch versucht zu benutzen

launchctl enable ~/Library/LaunchAgents/com.apple.myservice.plist

und ich bekomme nur eine

Usage: launchctl enable <service-target>

In Beantwortung.

Kann jemand bitte mit der richtigen Syntax antworten, um einen Launchd-Dienst unter OSX Yosemite zu laden?

almel
quelle
3
Könnte sein load -w wird helfen "Ich weiß, dass dies korrekt ist, da es sich um eine fast genaue Kopie einer funktionierenden Plist-Konfigurationsdatei handelt, die ich vor einigen Jahren erstellt habe." - Sie haben also den Wert für geändert Label, Ich hoffe? Sind Sie sicher, dass es sich nicht um einen On-Demand-Service handelt? Sie müssen uns das zeigen plist Datei. Ebenfalls, launchctl enable erwartet keinen Pfad; Sehen Sie Dinge wie user/<uid>/[service-name] im man launchctloder sehen Was ist der Unterschied zwischen einem service-name und ein service-target? .
Arjan
2
Stellen Sie außerdem sicher, dass .plist Datei ist NICHT von Gruppe und Welt beschreibbar. Und nebenbei, wenn es nicht irgendein von Apple bereitgestellter Dienst ist, dann verwenden Sie com.apple wird in der Zukunft nur verwirrend sein ...
Arjan
... und zum Schluss: Bist du dir sicher das File exists Ist nicht eine Ausgabe des Prozesses, den Sie ausführen möchten? Was sagt Console? Am Ende: Wir müssen das nur sehen plist Datei.
Arjan
@Arjan, ich habe vergessen, das Label in der .plist-Datei von der zuvor verwendeten korrekten zu ändern, was die Ausgabe "Datei vorhanden" erklärt. Jetzt, da es auf das richtige Etikett geändert wurde, funktioniert es wie erwartet. Wenn Sie meine ursprüngliche Frage beantworten wollten, akzeptiere ich sie als richtig.
almel

Antworten:

4

Ich bin heute auf ähnliche Probleme gestoßen.

Entladen Sie einfach den Dienst und laden Sie ihn erneut File exists Problem.

Es sieht so aus, als müssten Sie jedes Mal, wenn Sie eine plist-Datei aktualisieren, dies tun.

daisy
quelle
2

launchd kann leicht in "komische" Zustände gelangen.

  • load meint das lesen die Konfigurationsdatei und möglicherweise Zeitplan ein Start
  • unload meint das stop und Deaktivieren Sie die Konfigurationsdatei
  • start startet den Dienst (ich glaube den Zeitplan ignorieren)
  • stop stoppt den Dienst (erneut den Zeitplan ignorierend)

Wenn Sie es "neustarten" wollen, entladen und laden Sie die Konfiguration im Allgemeinen folgendermaßen:

launchctl unload -w ~/Library/LaunchAgents/com.apple.myservice.plist
launchctl load -w ~/Library/LaunchAgents/com.apple.myservice.plist

Das -w bedeutet "Schreiben", was bedeutet, dass die Änderung einen Neustart bewirkt (lädt jedes Login oder Boot ... oder wird beim Login oder Boot nicht mehr geladen).

Wenn es sich um einen Service auf Systemebene handelt (in /Library/LaunchDaemons oder /Library/LaunchAgents Möglicherweise müssen Sie es mit tun sudo (und wenn Sie es versehentlich ohne sudo getan haben, müssen Sie es möglicherweise ohne sudo entladen und anschließend mit sudo erneut laden)

Der Schlüssel in einer Datei, die dazu führt, dass start auf load ist RunAtLoad (und KeepAlive hält es weiter, wenn es aus irgendeinem Grund stirbt)

<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>

Es ist manchmal schwierig, die Debug-Protokollierung von launchctl selbst, aber den Schlüsseln, abzurufen StandardErrorPath und StandardOutPath Sie können zumindest wissen, ob Ihre Anwendung aufgrund fehlender oder fehlerhafter Informationen (z. B. einer nicht erweiterten Umgebungsvariablen oder eines nicht beschreibbaren Pfads) stirbt. Stellen Sie nur sicher, dass der von Ihnen angegebene Pfad vom Benutzer, der den Prozess ausführt, beschreibbar ist.

<key>StandardErrorPath</key>
<string>/tmp/appname-error.log</string>
<key>StandardOutPath</key>
<string>/tmp/appname-info.log</string>

Da sie so schwer zu debuggen sind, würde ich empfehlen Start Steuerung oder ins Leben gerufen und mischen Sie das mit einem gesunden Lesen von launchd.info .

Außerdem gibt es hier einige Debugging-Hinweise: https://serverfault.com/questions/183589/how-do-i-activate-launchd-logging-on-os-x

Ich habe es selbst noch nicht ausprobiert, aber diese Lösung sieht am einfachsten aus:

sudo launchctl log level debug 
tail -f /var/log/system.log
CoolAJ86
quelle