Ich versuche, ein Problem mit einem Bash-Skript zu beheben, das von launchd aufgerufen wird. Hier ist eine kurze Zusammenfassung
.plist
wird geladen und startet im richtigen Intervall und ruft das Bash-Skript auf. Das funktioniert also richtig.plist
wird von aufgerufen /Library/LaunchDaemons
(so dass er unabhängig davon ausgeführt werden kann, ob jemand angemeldet ist oder nicht). Das bedeutet, dass alles als root ausgeführt wird.Das Problem tritt innerhalb des Bash-Skripts auf, das ein AppleScript aufruft, um eine Benachrichtigung zu posten – es passiert einfach nie.
#!/bin/bash
# ------------------------------------------------------------------
sleep 11
echo "This is a test" > test.txt
/usr/bin/osascript /Users/allan/Documents/Scripts/AppleScript/notify.scpt "This is a test" "-Test Test Test" "nosound"
exit 0
Das ist es. Eine kurze Zusammenfassung dessen, was ich tue:
sleep 11
- launchd benötigt min. von 10 Sekunden Programmausführungszeit standardmäßig. Ich habe das hier nur eingefügt, um launchd unterzubringenecho "This is a test"
- Ich schreibe einfach eine einfache Zeichenfolge in eine Textdatei, um sicherzustellen, dass das Bash-Skript aufgerufen wird. Diese Datei wird mit der erwarteten Zeichenfolge erstellt ; das funktioniert./usr/bin/osascript /Users......blah blah blah...
das schlägt fehl . Dies ist nur ein einfaches AppleScript, das drei Argumente (Text, Titel und Ton) benötigt, um eine Benachrichtigung bereitzustellen.Wenn es von selbst oder einem Bash-Skript ausgeführt wird, das es aufruft, funktioniert es:
Wenn das Bash-Skript von launchd aufgerufen wird, scheint es einfach nicht zu funktionieren. Kann mich jemand in die richtige Richtung weisen? Was vermisse ich?
(OS X 10.11.6)
Dies ist das, .plist
was ich verwende (ja, ich weiß, es ist auf ein 45-Sekunden-Intervall eingestellt ... ich teste)
<?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.user.podcastCleanup</string>
<key>Program</key>
<string>/Users/allan/Documents/Scripts/Unix/podcastCleanup.sh</string>
<key>StartInterval</key>
<integer>45</integer>
<key>WorkingDirectory</key>
<string>/Users/allan/Documents</string>
</dict>
</plist>
notify.scpt
AppleScript, das zum Generieren der Benachrichtigung verwendet wird.
on run argv
set Message to item 1 of argv
set Title to item 2 of argv
set aud to item 3 of argv
set STitle to "Terminal"
set Snd to "Blow.aiff"
if (aud = "sound") then
display notification Message with title Title subtitle STitle sound name Snd
else
display notification Message with title Title subtitle STitle
end if
end run
Der Fehler tritt auf, weil die Befehle in Ihrem eine grafische Benutzersitzungosascript
erfordern . AppleScript erfordert eine grafische Benutzersitzung, um zu funktionieren.
Der Job wird als Benutzer in einer nicht grafischen Benutzersitzung launchd
ausgeführt .root
In diesen Situationen besteht der typische Ansatz darin, Daemons in zwei Teile aufzuteilen – einen computerweit und einen anderen innerhalb jeder grafischen Benutzersitzung. Zur Kommunikation wird häufig ein Rohr oder eine Buchse verwendet.
Auch als root
Benutzer gibt es Barrieren, die in macOS nicht überschritten werden können.
klanomath
klanomath
klanomath
Allan
Library/LaunchAgent
und es funktioniert gut, aber ich muss es ausführen, unabhängig davon, ob ich angemeldet bin oder nicht.