Als Pavel Selivanov fait remarquer dans ce article il est nécessaire de définir DBUS_SESSION_BUS_ADDRESS
y DISPLAY
pour activer les tâches liées à l'interface depuis un cronjob.
Il a écrit un Shell Shell, qui obtient la DBUS_SESSION_BUS_ADDRESS
pour XFCE, Gnome, Unity, Cinnamon et KDE. Je peux confirmer qu'il fonctionne sous ubuntu:16.04
.
$ sudo nano /usr/local/bin/gui-cron
#!/bin/sh
[ "$#" -lt 1 ] && echo "Usage: $0 program options" && exit 1
program="$1"
shift
user=$(whoami)
env_reference_process=$( pgrep -u "$user" xfce4-session || pgrep -u "$user" cinnamon-session || pgrep -u "$user" gnome-session || pgrep -u "$user" gnome-shell || pgrep -u "$user" kdeinit )
export DBUS_SESSION_BUS_ADDRESS=$(cat /proc/"$env_reference_process"/environ | grep -z ^DBUS_SESSION_BUS_ADDRESS= | sed 's/DBUS_SESSION_BUS_ADDRESS=//')
export DISPLAY=$(cat /proc/"$env_reference_process"/environ | grep -z ^DISPLAY= | sed 's/DISPLAY=//')
"$program" "$@"
On peut alors créer un cronjob utilisateur qui s'exécute selon un horaire donné avec la syntaxe crontab. Ici, par exemple, toutes les 15 minutes entre 22:00 et 05:59 :
$ crontab -e
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
*/15 22-23,00-05 * * * gui-cron gnome-session-quit --power-off