Bash-Skript, das osascript aufruft, funktioniert nicht mehr, wenn es von launchd ausgeführt wird

Ich versuche, ein Problem mit einem Bash-Skript zu beheben, das von launchd aufgerufen wird. Hier ist eine kurze Zusammenfassung

  • Das manuelle Aufrufen des Skripts funktioniert ohne Fehler.
  • Innerhalb des Bash-Skripts ruft es ein AppleScript auf, das eine Benachrichtigung sendet, dass AppleScript gut funktioniert.
  • Der .plistwird geladen und startet im richtigen Intervall und ruft das Bash-Skript auf. Das funktioniert also richtig
  • Der .plistwird 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:

  1. sleep 11- launchd benötigt min. von 10 Sekunden Programmausführungszeit standardmäßig. Ich habe das hier nur eingefügt, um launchd unterzubringen
  2. echo "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.
  3. /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:

Geben Sie hier die Bildbeschreibung ein

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, .plistwas 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>


Es folgt das notify.scptAppleScript, 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
Bitte fügen Sie das scpt und die plist hinzu. Ich bin zu faul, um es zu erstellen!
Kein Problem, dies in 10.11.6 als ~/Lib/LaunchAgent zum Laufen zu bringen - sogar mit Sleep auf 1 und StartInterval auf 10 ohne Fehler. Bitte überprüfen Sie die Pfade in der plist und ist die sh ausführbar?
Als /Lib/LaunchDaemon lautet der launchd-Fehler „osascript[12982:35171] CFPasteboardRef CFPasteboardCreate(CFAllocatorRef, CFStringRef) : failed to create global data“
@klanomath - Getestet als Library/LaunchAgentund es funktioniert gut, aber ich muss es ausführen, unabhängig davon, ob ich angemeldet bin oder nicht.

Antworten (1)

Grafische Benutzersitzung erforderlich

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 launchdausgeführt .root

Alternativer Ansatz

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 rootBenutzer gibt es Barrieren, die in macOS nicht überschritten werden können.

@Allan, um es zu beheben, versuchen Sie bitte, es von ~/Library/LaunchAgents/ zu laden.
Das macht jetzt Sinn, wo du es erklärst. Da ich es unabhängig davon ausführen muss, ob ich angemeldet bin oder nicht, kann ich nicht tun, was @MateuszSzlosek vorgeschlagen hat. Was ich tun werde, ist, das "Ergebnis" in eine Textdatei zu schreiben, die von einem anderen Skript verarbeitet wird, das Benachrichtigungen generiert, wenn ich angemeldet bin ... oder etwas in dieser Richtung.