Bash Script que llama a osascript deja de funcionar cuando se ejecuta con launchd

2

Estoy tratando de solucionar un problema con un script de bash al que launchd llama. Aquí hay un breve resumen

  • Llamar el script manualmente solo funciona bien sin errores.
  • Dentro del script de bash, llama a AppleScript que publica una notificación de que AppleScript funciona bien.
  • El .plist se carga y comienza en el intervalo correcto y llama al script de bash. Así que eso funciona correctamente.
  • Se llama a .plist desde /Library/LaunchDaemons (por lo que puede ejecutarse independientemente de si alguien ha iniciado sesión o no). Esto significa que todo se ejecuta como root.

El problema se produce dentro de la secuencia de comandos de bash que llama a un AppleScript para publicar una notificación, simplemente nunca sucede.

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

Eso es todo. Un breve resumen de lo que estoy haciendo:

  1. sleep 11 - launchd necesita un min. De 10 segundos de tiempo de ejecución del programa por defecto. Acabo de poner esto aquí para acomodar a launchd
  2. echo "This is a test" : solo escribo una cadena simple en un archivo de texto para asegurarme de que se llame al script bash. Este archivo se crea con la cadena esperada ; esto funciona.
  3. /usr/bin/osascript /Users......blah blah blah... esto falla . Esto es solo un simple AppleScript que toma tres argumentos (cuerpo, título y sonido) para proporcionar una notificación.

Al ejecutarse por sí mismo o bash script que lo llama, funciona:

Cuandosellamaalscriptbashdesdelaunchdparecequesimplementenofunciona.¿Alguienpuedeseñalarmeenladireccióncorrecta?¿Quémeestoyperdiendo?

(OSX10.11.6)

Esteesel.plistqueestoyusando(sí,séqueestáconfiguradoparaunintervalode45segundos...estoyprobando)

<?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>

A continuación se muestra el notify.scpt de AppleScript que se utiliza para generar la notificación.
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
    
pregunta Allan 17.10.2016 - 05:56

1 respuesta

3

Sesión de usuario gráfica requerida

El error se produce porque los comandos en su osascript requieren un sesión gráfica de usuario . AppleScript requiere una sesión de usuario gráfica para funcionar.

El trabajo launchd se está ejecutando como usuario root en una sesión de usuario no gráfica.

Enfoque alternativo

En estas situaciones, el enfoque típico es dividir los demonios en dos partes: una para toda la computadora y otra para cada sesión gráfica de usuario. Una tubería o un zócalo se usa frecuentemente para comunicarse.

Incluso como usuario root , existen barreras que no se pueden cruzar en macOS.

    
respondido por el Graham Miln 17.10.2016 - 08:17

Lea otras preguntas en las etiquetas