2 votos

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

Estoy tratando de solucionar un problema con un script en bash que se llama por launchd. He aquí un resumen rápido

  • Llamar el script manualmente por sí funciona correctamente, sin errores.
  • Dentro de la secuencia de comandos bash llama a un AppleScript que envía una notificación de Que AppleScript funciona bien.
  • El .plist se carga y se inicia en el intervalo correcto y se llama a la secuencia de comandos bash. Para que funcione correctamente
  • El .plist desde /Library/LaunchDaemons (por lo que se puede ejecutar sin importar si alguien está conectado o no). Esto significa que todo se ejecuta como root.

El problema se produce dentro de la bash script que llama a un AppleScript para publicar una notificación - esto 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 resumen rápido de lo que yo estoy haciendo:

  1. sleep 11 - launchd necesidades de un min. de 10 segundos de programa de tiempo de ejecución por defecto. Acabo de poner esto aquí para dar cabida a launchd
  2. echo "This is a test" - Acabo de escribir una simple cadena de caracteres en un archivo de texto para asegurarse de que el script de bash que está recibiendo la llamada. Este archivo se crea con la cadena esperada; esto funciona.
  3. /usr/bin/osascript /Users......blah blah blah... esta falla. Esto es sólo un sencillo AppleScript que toma tres argumentos (el cuerpo, el título, y el sonido) para proporcionar una notificación.

Ejecutar por sí mismo o un script de bash que se llama, funciona:

enter image description here

Cuando el script de bash que se llama desde launchd parece que no sólo el trabajo. Puede alguien me apunte en la dirección correcta? Lo que me estoy perdiendo?

(OS X 10.11.6)


Esta es la .plist estoy usando (sí, sé que se trata de un set de 45 segundos de intervalo...estoy probando)

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


El siguiente es el notify.scpt 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

3voto

Steve Evans Puntos 155

Gráfica De Usuario De Sesión Requerido

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

El launchd se ejecuta el trabajo como el root de usuario en un no-gráfica de usuario de la sesión.

Enfoque Alternativo

En estas situaciones, el enfoque típico es dividir a los demonios en dos partes – un equipo de ancho y otro dentro de cada gráfica de usuario de la sesión. Una tubería o un socket se utiliza con frecuencia para comunicarse.

Incluso como root de usuario, existen barreras que no puede ser cruzado en macOS.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X