13

Example script error.sh:

#! /bin/bash

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

My incron-config:

~/Documents IN_MOVED_TO ~/scripts/error.sh

If I run error.sh in terminal GUI dialog pops, but not in above incron scenario.

How can I make zenity to pop that dialog when I move file in Documents folder?

3 Answers 3

23

Found answer here. Add to ~/.bashrc:

xhost local:$USER > /dev/null

and then use zenity in script evoked by cron like this:

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

adding --display=:0.0 is what's important

2
  • 1
    --display=:0.0 was important. But now I have same problem for service. It doesn't show anything if I put script as service!
    – Dr.jacky
    Commented Mar 11, 2017 at 13:51
  • What is the first part, xhost local:$USER > /dev/null, used for? It works fine with just --display=:0.0.
    – marlar
    Commented Nov 3, 2021 at 16:32
12

To run a GUI command on cron, you'll have to tell cron what display the program should use. For that you use:export DISPLAY=:0

For a zenity notification each 30 minutes, edit with crontab -e and set a job like:

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

Detailed how to: link

3

There's another possible solution if you want it to work regardless of username, by finding the active user of the X display, using ConsoleKit (the command ck-list-sessions). Assuming the below script is run as root, it will show a zenity message to the current active user on your computer:

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

The little awk script is just for parsing ck-list-sessions and outputting the username and display of the user that is active (could also require that it's a local connection if you want to exclude ssh -X users, if you want).

(I use this in a backup script that runs on plugging in a USB drive.)

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .