So starten Sie einen Dienst mit dem Startprogramm von Mac OSX

13475
almel

Warum wird meine Konfigurationsplist-Datei nicht als Dienst mit launchctl 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?

3
Vielleicht hilft 'load -w'. * "Ich weiß, dass dies korrekt ist, weil es sich um eine fast exakte Kopie einer funktionierenden Plist-Konfigurationsdatei handelt, die ich vor einigen Jahren erstellt habe" * - Sie haben also den Wert für `Label` geändert, hoffe ich? Sind Sie sicher, dass es sich nicht um einen On-Demand-Service handelt? Sie müssen uns die "plist" -Datei zeigen. 'Launchctl enable' erwartet auch keinen Pfad; siehe Dinge wie "Benutzer // [service-name] `in` man launchctl` oder siehe [Was ist der Unterschied zwischen einem 'service-name' und einem 'service-target'?] (http://apple.stackexchange.com/questions/166397) / was ist der Unterschied zwischen einem Dienstnamen und einem Dienstziel). Arjan vor 8 Jahren 3
Stellen Sie außerdem sicher, dass die .plist-Datei NICHT von Gruppe und Welt beschrieben werden kann. Abgesehen davon, wenn es nicht irgendein von Apple bereitgestellter Dienst ist, wird die Verwendung von "com.apple" in Zukunft nur verwirrend sein ... Arjan vor 8 Jahren 2
... und zum Schluss: Sind Sie sicher, dass die Datei existiert nicht eine Ausgabe des Prozesses, den Sie ausführen möchten? Was sagt Console? Am Ende: Wir müssen nur diese "plist" -Datei sehen. Arjan vor 8 Jahren 0
@ Arjan, ich habe vergessen, das Label in der .plist-Datei von der zuvor verwendeten korrekten zu ändern, was die Ausgabe "Datei vorhanden" erklärt. Nun, 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 vor 8 Jahren 0

2 Antworten auf die Frage

4
daisy

Ich bin heute auf ähnliche Probleme gestoßen.

Entladen Sie einfach den Dienst und laden Sie ihn erneut, um das File existsProblem zu lösen.

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

1
CoolAJ86

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

  • loadbedeutet, die Konfigurationsdatei zu lesen und möglicherweise einen Start zu planen .
  • unloadbedeutet stop und Unschedule der Konfigurationsdatei
  • start wird den Dienst starten (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 wie folgt:

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

Das -wbedeutet "Schreiben", was bedeutet, dass die Änderung einen Neustart bewirkt (wird bei jedem Login oder Startvorgang geladen ... oder beim Anmelden oder Startvorgang nicht mehr geladen).

Wenn es sich um einen Service auf Systemebene handelt (in /Library/LaunchDaemonsoder /Library/LaunchAgentsSie müssen es möglicherweise mit erledigen 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 es bewirkt, dass startauf loadist RunAtLoad(und KeepAlivehält es läuft, wenn es aus irgendeinem Grund stirbt)

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

Es ist manchmal schwierig, die Debug-Protokollierung von launchctl selbst zu erhalten, aber die Schlüssel StandardErrorPathund StandardOutPathkönnen Ihnen zumindest helfen zu 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, schreibbar ist.

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

Weil sie so schwer zu debuggen ist, dann würde ich mit empfehlen LaunchControl oder ins Leben gerufen und mit einem gesunden Lektüre mische launchd.info .

Außerdem finden Sie hier einige Hinweise zum Debuggen: 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