Bash Script che chiama osascript smette di funzionare quando viene eseguito da launchd

2

Sto cercando di risolvere un problema con uno script bash che viene chiamato da launchd. Ecco un breve riassunto

  • Chiamare lo script manualmente da solo funziona bene senza errori.
  • All'interno dello script bash chiama un AppleScript che pubblica una notifica che AppleScript funziona bene.
  • Il .plist viene caricato e prende il via all'intervallo corretto e chiama lo script bash. In modo che funzioni correttamente
  • Il .plist viene chiamato da /Library/LaunchDaemons (quindi può essere eseguito indipendentemente dal fatto che qualcuno abbia effettuato l'accesso o meno). Ciò significa che tutto viene eseguito come root.

Il problema si verifica all'interno dello script bash che chiama un AppleScript per pubblicare una notifica, ma non succede mai.

#!/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

Questo è tutto. Un breve riassunto di ciò che sto facendo:

  1. sleep 11 - launchd ha bisogno di un minuto. di 10 secondi di tempo di esecuzione del programma per impostazione predefinita. L'ho messo qui per sistemare launchd
  2. echo "This is a test" - Scrivo semplicemente una semplice stringa in un file di testo per assicurarmi che lo script di bash venga richiamato. Questo file viene creato con la stringa prevista ; questo funziona.
  3. /usr/bin/osascript /Users......blah blah blah... questo fallisce . Questo è solo un semplice AppleScript che accetta tre argomenti (corpo, titolo e suono) per fornire una notifica.

Eseguendo da solo o script bash che lo chiama, funziona:

Quandoloscriptdibashvienechiamatodalaunchdsembranonfunzionare.Qualcunopuòindicarmilagiustadirezione?Cosamimanca?

(OSX10.11.6)

Questoèil.plistchestousando(sì,socheèimpostatoperunintervallodi45secondi...stotestando)

<?xmlversion="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>

Di seguito è riportato il notify.scpt AppleScript utilizzato per generare la notifica.
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
    
posta Allan 17.10.2016 - 05:56
fonte

1 risposta

3

Sessione utente grafica richiesta

L'errore si verifica perché i comandi nel osascript richiedono un sessione utente grafica . AppleScript richiede una sessione utente grafica per funzionare.

Il processo launchd è in esecuzione come root utente in una sessione utente non grafica.

Approccio alternativo

In queste situazioni, l'approccio tipico è quello di dividere i daemon in due parti: una a livello di computer e l'altra all'interno di ciascuna sessione utente grafica. Una pipa o un socket sono spesso usati per comunicare.

Anche se root utente, ci sono barriere che non possono essere incrociate in macOS.

    
risposta data 17.10.2016 - 08:17
fonte

Leggi altre domande sui tag