Die Startdiskette kann unter Mac OS X nicht erfolgreich ausgeführt werden

3061
Jinglei.Y

Ich verwende Mac OS X 10.10.5 (Yosemite) und lerne, wie Sie mit launchd (Launch Daemon) einige Skripts automatisch ausführen können. Um es einfach zu machen, entscheide ich mich für ein shellSkript, das nur einen echoBefehl enthält .

Inhalt von hello.sh:

#! /bin/sh echo "hello" 

Ich habe auch ausgeführt chmod a+x hello.sh, um es ausführbar zu machen, und wenn ich das Skript manuell ausführe, funktioniert es gut.

In ~/Library/LaunchAgents/habe ichcom.yang.hello.plist

<?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>com.yang.hello</string> <key>Program</key> <string>/Users/yangyy/hello.sh</string> <key>RunAtLoad</key> <true/> </dict> </plist> 

Nachdem ich gelaufen bin:

launchctl load -w ~/Library/LaunchAgents/com.yang.hello.plist 

Es wird keine Fehlermeldung angezeigt und wenn ich diesen Befehl ausführen:

launchctl list | grep "com.yang.hello" 

Die Antwort, die ich bekomme, ist:

- 78 com.yang.hello.plist 

Es scheint, dass eine positive Zahl den Exit-Code anzeigt und das Programm tatsächlich nicht läuft.

Außerdem finde ich etwas seltsam, als ich versuchte, launchctl start ~/Library/LaunchAgents/com.yang.hello.plistdas Programm auszuführen, aber wenn ich diesen Befehl verwende, wird ein Fehler und keine Fehlermeldung zurückgegeben.

Was ist falsch?

1

2 Antworten auf die Frage

1
Gordon Davisson

Ich weiß nicht, was der Exit-Status von 78 bedeutet, aber ich würde nicht erwarten, dass dieses Skript etwas Erkennbares tut, wenn es als Startagent ausgeführt wird, da seine Ausgabe nicht irgendwo weitergeleitet wird. Wenn Sie es von Terminal aus ausführen, wird seine Ausgabe an dieses Terminalfenster angehängt, daher wird dort das "Hallo" angezeigt. Launchd hat jedoch keine Verbindung zu Terminal (oder einem anderen relevanten Ausgabeziel), so dass das "Hallo" verworfen wird. Wenn Sie prüfen möchten, ob es ausgeführt wird, können Sie seine Ausgaben (Standardausgabe und Fehlerausgabe) in Dateien umleiten, indem Sie diese Schlüssel zur .plist hinzufügen (und sie dann entladen und erneut laden):

<key>StandardOutPath</key> <string>/Users/yangyy/hello-output.txt</string> <key>StandardErrorPath</key> <string>/Users/yangyy/hello-errors.txt</string> 

Es ist auch möglich, dass launchd ein anderes Problem hat, selbst wenn das Skript gestartet wird. Um tail -f /var/log/system.logherauszufinden, ob launchd selbst Probleme meldet, schauen Sie in die Systemprotokolldatei ( oder führen Sie /Applications/Utilities/Console.app aus). Versuchen Sie dann, den Agenten zu entladen + neu zu laden, und prüfen Sie, ob relevante Elemente im Protokoll angezeigt werden.

Dies hilft, da in der Ausgabedatei 'Hallo' ist. Ich dachte, es würde sich nur im Terminal zeigen. Vielen Dank. Jinglei.Y vor 8 Jahren 0
0
Dan Bergh Johnsson

Die Nummer, die Sie in sehen, launchctl listist der Statuscode, den der Daemon-Prozess beim Beenden ausgegeben hat.

Die gute Nachricht ist also, dass der Prozess ablief.

Status 78 ist ein allgemeiner Beendigungscode. Die schlechte Nachricht ist, dass er uns nicht viel sagt.

Es hilft Ihnen nicht, Ihr genaues Problem zu lösen, sondern wirft ein wenig Licht auf das, was los ist.