web-dev-qa-db-fra.com

Comment appeler zenity à partir du script cron?

Exemple de script error.sh:

#! /bin/bash

zenity --error --text='Something very bad has happened!'  

Mon incron-config:

~/Documents IN_MOVED_TO ~/scripts/error.sh

Si j'exécute error.sh dans la boîte de dialogue de l'interface graphique du terminal, mais pas dans le scénario d'incron ci-dessus.

Comment puis-je faire en sorte que zenity ouvre cette boîte de dialogue lorsque je déplace un fichier dans le dossier Documents?

8
zetah

Réponse trouvée ici . Ajouter à ~/.bashrc:

xhost local:$USER > /dev/null

puis utilisez zenity dans le script évoqué par cron comme ceci:

zenity --error --text='Something very bad has happened!' --display=:0.0

l'ajout de --display=:0.0 est ce qui est important

18
zetah

Pour exécuter une commande graphique sur cron, vous devez indiquer à cron quel affichage le programme doit utiliser. Pour cela, vous utilisez: export DISPLAY =: 0

Pour une notification zenity toutes les 30 minutes, éditez avec crontab -e et définissez un travail comme:

*/30 *  * * *  export DISPLAY=:0 && /somedirectory/your_zenity_script.sh

Comment faire pour: lien

3
damodaranudas

Il existe une autre solution possible si vous voulez que cela fonctionne quel que soit le nom d'utilisateur, en recherchant l'utilisateur actif de l'écran X à l'aide de ConsoleKit (la commande ck-list-sessions). En supposant que le script ci-dessous soit exécuté en tant que root, il affichera un message zenity à l'utilisateur actuellement actif sur votre ordinateur:

#!/bin/bash
ACTIVE=$(ck-list-sessions | awk -F' = ' '
    function f(){if(A=="TRUE"){P=U"\t"D;gsub("'"'"'","",P);print P}}
    $1=="\tunix-user"{U=$2} 
    $1=="\tx11-display"{D=$2} 
    $1=="\tactive"{A=$2} 
    END{f()} /^[^\t]/{f()}
')
USERID=${ACTIVE%    *} # tab
USERNAME=$(getent passwd $USERID|cut -f1 -d':')
DISPLAY=${ACTIVE#*  } # tab

DISPLAY="$DISPLAY" su $USERNAME -c "zenity --error --text='Something very bad has happened!'"

Le petit script awk sert uniquement à analyser ck-list-sessions et à afficher le nom d'utilisateur et l'affichage de l'utilisateur actif (une connexion locale peut également être nécessaire si vous souhaitez exclure les utilisateurs ssh -X, si vous le souhaitez).

(J'utilise ceci dans un sauvegarde script qui s'exécute lors du branchement d'un lecteur USB.)

2
unhammer