Gsettings avec cron

J’ai écrit un script bash qui change le fond d’écran (pour GNOME3).

#!/bin/bash # Wallpaper's directory. dir="${HOME}/images/wallpapers/" # Random wallpaper. wallpaper=`find "${dir}" -type f | shuf -n1` # Change wallpaper. # http://bit.ly/HYEU9H gsettings set org.gnome.desktop.background picture-options "spanned" gsettings set org.gnome.desktop.background picture-uri "file://${wallpaper}" 

Le script exécuté dans un émulateur de terminal (par exemple, gnome-terminal) fonctionne très bien. Pendant l’exécution par cron, ou le terminal ttyX reçoit l’erreur:

 ** (process:26717): WARNING **: Command line `dbus-launch --autolaunch=d64a757758b286540cc0858400000603 --binary-syntax --close-stderr' exited with non-zero exit status 1: Autolaunch error: X11 initialization failed.\n ** (process:26717): WARNING **: Command line `dbus-launch --autolaunch=d64a757758b286540cc0858400000603 --binary-syntax --close-stderr' exited with non-zero exit status 1: Autolaunch error: X11 initialization failed.\n ** (process:26721): WARNING **: Command line `dbus-launch --autolaunch=d64a757758b286540cc0858400000603 --binary-syntax --close-stderr' exited with non-zero exit status 1: Autolaunch error: X11 initialization failed.\n ** (process:26721): WARNING **: Command line `dbus-launch --autolaunch=d64a757758b286540cc0858400000603 --binary-syntax --close-stderr' exited with non-zero exit status 1: Autolaunch error: X11 initialization failed.\n 

Finalement, j’ai réussi à résoudre ce problème après de nombreuses tentatives.

En effet, le problème se produit car cron n’utilise qu’un ensemble très restreint de variables d’environnement. Et la seule variable d’environnement responsable de l’exécution correcte du script de la question lorsque celle-ci est définie comme tâche cron est DBUS_SESSION_BUS_ADDRESS , et non DISPLAY ou XAUTHORITY ou GSETTINGS_BACKEND ou autre chose. Ce fait a également été bien souligné dans cette réponse .

Mais le problème dans cette réponse est qu’il n’y a aucune garantie que la variable DBUS_SESSION_BUS_ADDRESS de ce fichier à partir du répertoire ~/.dbus/session-bus/ soit mise à jour à la valeur actuelle de la session gnome en cours. Pour résoudre ce problème, une méthode consisterait à trouver le PID d’un processus dans la session gnome en cours et à obtenir l’adresse dbus de son environnement. Nous pouvons le faire comme suit:

 PID=$(pgrep gnome-session) # instead of 'gnome-session' it can be also used 'noutilus' or 'compiz' or the name of a process of a graphical program about that you are sure that is running after you log in the X session export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ|cut -d= -f2-) 

Cela étant dit, le script devrait ressembler à ceci:

 #!/bin/bash # TODO: At night only dark wallpapers. # Wallpaper's directory. dir="${HOME}/images/wallpapers/" # export DBUS_SESSION_BUS_ADDRESS environment variable PID=$(pgrep gnome-session) export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ|cut -d= -f2-) # Random wallpaper. wallpaper=`find "${dir}" -type f | shuf -n1` # Change wallpaper. # http://bit.ly/HYEU9H gsettings set org.gnome.desktop.background picture-options "spanned" gsettings set org.gnome.desktop.background picture-uri "file://${wallpaper}" 

J’ai trouvé des solutions. Lorsque vous exportez une variable DBUS_SESSION_BUS_ADDRESS contenue dans le fichier ~ / .dbus / session-bus / *, dbus-launch n’en dit pas plus sur l’erreur. Cependant, au lieu de papier peint, il y a des artefacts.

Code ajouté:

 sessionfile=`find "${HOME}/.dbus/session-bus/" -type f` export `grep "DBUS_SESSION_BUS_ADDRESS" "${sessionfile}" | sed '/^#/d'` 

Maintenant, le script ressemble à ceci:

 #!/bin/bash # TODO: At night only dark wallpapers. # Wallpaper's directory. dir="${HOME}/images/wallpapers/" # Weird, but necessary thing to run with cron. sessionfile=`find "${HOME}/.dbus/session-bus/" -type f` export `grep "DBUS_SESSION_BUS_ADDRESS" "${sessionfile}" | sed '/^#/d'` # Random wallpaper. wallpaper=`find "${dir}" -type f | shuf -n1` # Change wallpaper. # https://superuser.com/questions/298050/periodically-changing-wallpaper-under-gnome-3/298182#298182 gsettings set org.gnome.desktop.background picture-options "spanned" gsettings set org.gnome.desktop.background picture-uri "file://${wallpaper}" 

J’ai essayé ça et ça a bien marché pour moi:

 dbus-launch --exit-with-session gsettings set schema key value 

Ou de la racine cron:

 sudo -u user dbus-launch --exit-with-session gsettings set schema key value 

Crédit: http://php.mandelson.org/wp2/?p=565

Pour changer votre fond d’écran via cron, faites-le directement dans votre crontab: Exécuter crontab -e

Ajoutez des lignes comme ceci:

30 09 * * * DISPLAY =: 0 GSETTINGS_BACKEND = dconf / usr / bin / gsettings set org.gnome.desktop.background fichier image-uri: ////home/elison/Pictures/morning.jpg

00 12 * * * DISPLAY =: 0 GSETTINGS_BACKEND = dconf / usr / bin / gsettings set org.gnome.desktop.background fichier image-uri: ////home/elison/Pictures/noon.jpg

add export DISPLAY =: 0 && export XAUTHORITY = / home / nom d’utilisateur / .Xauthority, où nom d’utilisateur est votre nom d’utilisateur ubuntu. Il devrait corriger l’erreur d’autorisation X11.