2015-12-11 3 views
18

Ich möchte einen Unison Sync-Dienst ausführen, der immer im Hintergrund ausgeführt wird, wenn ich mich anmelde. Aber der Statuscode meines Agenten ist 78. Ich weiß nicht warum, ich habe versucht, ein paar online gepostet, aber es funktioniert einfach nicht.Was bedeutet Launchd-Status 78? Warum läuft mein User Agent nicht?

Was ist das Problem? Unten ist die Plist-Datei für meinen Dienst.

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>Label</key> 
    <string>syncmyproject</string> 
    <key>StandardOutPath</key> 
    <string>/var/log/syncmyproject.log</string> 
    <key>StandardErrorPath</key> 
    <string>/var/log/syncmyproject.log</string> 
    <key>RunAtLoad</key> 
    <true/> 
    <key>KeepAlive</key> 
    <true/> 
    <key>Debug</key> 
    <true/> 
    <key>EnableGlobbing</key> 
    <true/> 
    <key>ProgramArguments</key> 
    <array> 
     <string>/usr/local/bin/unison</string> 
     <string>-auto</string> 
     <string>-batch</string> 
     <string>-repeat watch</string> 
     <string>~/home/project</string> 
     <string>~/project</string> 
    </array> 
</dict> 
</plist> 
+0

Sie können diese Datei für mögliche Hinweise "grep", was falsch ist: '/ var/log/system.log' – Nick

Antwort

22

Ich las man launchctl, finden 78 Mittel function not implemented. Es hilft nicht viel.

Schließlich mache ich es funktioniert, eigentlich gab es Fehler in der PLIST, ich empfehle, die brew cask install launchcontrol, die ein GUI-Tool für launchctl ist, installieren, kann es helfen, Fehler und Probleme bei der Erschießung zu erkennen.

+3

Danke dafür. launchcontrol hat mein Problem gelöst. Für den Datensatz hatte ich Status 78 und mein Problem war, dass mein Skript nicht mit einem Interpreter e, g gestartet wurde; '#!/bin/sh' – gooddadmike

+1

Für mich war das Problem, dass das Protokollverzeichnis vom aktuellen Benutzer nicht erreichbar war. – d4Rk

+0

ja, ich auch. Ich hatte einen Fehler im Shebang. Dies machte es schwierig zu debuggen, da das Skript fehlerlos funktionierte, als ich es ausführte, aber nicht, als launchd versuchte, es auszuführen. – wetjosh

0

Ich habe diesen Fehler beim Versuch, Mono zu starten, um einen lokalen Webserver zu starten. Es stellte sich heraus, dass der Fix nicht den Mono-Pfad von "which mono" (was ein Symlink ist: /Library/Frameworks/Mono.framework/Versions/Current/Commands/mono), sondern die tatsächliche Position der exe (in meinem Fall /Library/Frameworks/Mono.framework/Commands/mono).

5

[in dieses Problem Ran als gut, so zu dokumentieren, was ich gefunden habe]

„78“ ist der letzte Exit-Code des Auftrags Sie ausführen. Von man launchctl:

Ohne Argumente Liste alle Aufträge in launchd geladen in drei Spalten. In der ersten Spalte wird die PID des Jobs angezeigt, wenn er ausgeführt wird: . Die zweite Spalte zeigt den letzten Exit-Status des Jobs an. Wenn die Zahl in dieser Spalte negativ ist, stellt sie das Negativ das Signal dar, das den Auftrag gestoppt hat. Somit würde "-15" anzeigen, dass der Job mit SIGTERM beendet wurde. Die dritte Spalte ist das Label des Jobs. Wenn [label] angegeben wird, werden Informationen zum angeforderten Job gedruckt.

I.e. Sie müssen die Dokumentation (oder den Quellcode) für jeden Job lesen, den Sie gerade beginnen. (In meinem Fall, mysqld)

Es ist erwähnenswert, dass "78" als standard exit code unter Linux erwähnt wird, was auf einen Konfigurationsfehler hinweist. Werfen Sie einen Blick auf Ihre Jobkonfiguration (und Fehlerprotokolle?), Um zu sehen, ob etwas falsch konfiguriert ist.

+0

in meinem Fall hatte ich vergessen, chmod + x das Shell-Skript ':) – eddyce

0

Ich fand den Fehler hatte mit Berechtigungen zu tun. Ich war, dass ich versuchte, Fehler und Protokolle in das Verzeichnis/var/log umzuleiten (zu dem mein Benutzer nicht schreiben kann!) den Pfad zu etwas ändern, wo mein Benutzer die richtigen Berechtigungen hatte, um es zu beheben.

Seien Sie vorsichtig beim Laden Ihrer LaunchAgents. Verwenden Sie sudo nicht, um ein PLIST zu laden, wenn Sie sich im Verzeichnis ~/Library/LaunchAgents befinden.

1

Hier ist was mich gefangen: In Mac OS X können Sie Shell-Skripte über die Befehlszeile ausführen, auch wenn es nur "das Skript" in der Datei gibt. Wenn Sie sie jedoch von launchd aus ausführen, müssen Sie angeben, in welcher Binärdatei das Skript ausgeführt werden soll. A angenommen, dass, wenn Sie von der Kommandozeile laufen, es nur die Shell verwendet, in der Sie sich gerade befinden (in meinem Fall bash), aber wenn Sie von launchd aus starten, gibt es kein "umgebendes Skript". Ich habe

#!/bin/sh 

als die erste Zeile in der Skriptdatei, und es funktionierte dann.