2 votes

Bash script qui appelle osascript cesse de fonctionner lorsqu'il est exécuté par launchd

J'essaie de résoudre un problème avec un bash script qui est appelé par launchd. Voici un résumé rapide

  • L'appel du script manuellement par lui-même fonctionne bien, sans erreur.
  • Dans le script de bash, il appelle un AppleScript qui affiche une notification Cet AppleScript fonctionne bien.
  • El .plist est chargé et démarre à l'intervalle correct et appelle le script de bash. Donc cela fonctionne correctement
  • El .plist est appelé à partir de /Library/LaunchDaemons (afin qu'il puisse fonctionner indépendamment du fait que quelqu'un soit connecté ou non). Cela signifie que tout est exécuté en tant que Root.

Le problème se produit dans le bash script qui appelle un AppleScript pour afficher une notification - cela ne se produit jamais.

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

C'est ça. Un résumé rapide de ce que je fais :

  1. sleep 11 - launchd a besoin d'un minimum de 10 secondes de temps d'exécution du programme par défaut. J'ai juste mis ceci ici pour accommoder launchd
  2. echo "This is a test" - J'écris juste une simple chaîne dans un fichier texte pour m'assurer que le script bash script est appelé. Ce fichier est créé avec la chaîne attendue ; cela fonctionne.
  3. /usr/bin/osascript /Users......blah blah blah... cela échoue . Il s'agit d'un simple AppleScript qui prend trois arguments (corps, titre et son) pour fournir une notification.

En s'exécutant tout seul ou avec le bash script qui l'appelle, il fonctionne :

enter image description here

Lorsque le bash script est appelé depuis launchd, il semble ne pas fonctionner. Quelqu'un peut-il m'indiquer la bonne direction ? Qu'est-ce qui me manque ?

(OS X 10.11.6)


C'est le .plist J'utilise (oui je sais que c'est réglé pour un intervalle de 45 secondes... je 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>

Voici le notify.scpt AppleScript qui est utilisé pour générer la notification.

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

0 votes

Veuillez ajouter le scpt et le plist. Je suis trop paresseux pour les créer !

0 votes

Aucun problème pour le faire fonctionner sous 10.11.6 en tant que ~/Lib/LaunchAgent - même avec sleep à 1 et StartInterval à 10 sans aucune erreur. Vérifiez les chemins dans le plist et le sh est-il exécutable ?

0 votes

En tant que /Lib/LaunchDaemon l'erreur launchd est "osascript[12982:35171] CFPasteboardRef CFPasteboardCreate(CFAllocatorRef, CFStringRef) : failed to create global data" (erreur de création de données globales)

3voto

Graham Miln Points 39606

Session utilisateur graphique requise

L'erreur se produit parce que les commandes de votre osascript exiger un session utilisateur graphique . AppleScript nécessite une session utilisateur graphique pour fonctionner.

El launchd est en cours d'exécution en tant que root utilisateur dans une session utilisateur non graphique.

Approche alternative

Dans ces situations, l'approche typique consiste à diviser les démons en deux parties - une à l'échelle de l'ordinateur et une autre au sein de chaque session utilisateur graphique. Un tuyau ou un socket est fréquemment utilisé pour communiquer.

Même si root utilisateur, il y a des barrières qui ne peuvent pas être franchies dans MacOS.

0 votes

@Allan pour le corriger, essayez de le charger à partir de ~/Library/LaunchAgents/.

1 votes

Cela a du sens maintenant que vous l'expliquez. Comme j'ai besoin qu'il s'exécute indépendamment du fait que je sois connecté ou non, je ne peux pas faire ce que @MateuszSzlosek a suggéré. Ce que je vais faire, c'est écrire le "résultat" dans un fichier texte qui sera traité par un autre script qui génère des notifications lorsque je suis connecté... ou quelque chose de ce genre.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X