J'utilise la version 12.04 avec un arrière-plan XML personnalisé (modification le jour de Ubuntu) qui change en fonction de l'heure. J'ai remarqué qu'il y a un délai important entre le moment où les modifications sont planifiées dans le fichier XML et le moment où elles apparaissent en arrière-plan. J'ai également remarqué que lorsque je reprends la suspension, je n'obtiens pas non plus la bonne image d'arrière-plan. J'ai constaté que le fait de recycler manuellement le fond d'écran corrigera ce problème et j'ai écrit un script pour automatiser le processus.
Si j'exécute le script manuellement, cela fonctionne bien. Cependant, lorsque je programme l'exécution du script dans cron, celui-ci ne change pas l'arrière-plan. Pour m'assurer que le script était exécuté correctement par cron, je lui ai demandé de créer un répertoire dans mon dossier de départ après avoir exécuté la modification d'arrière-plan. Le répertoire a été créé avec succès. Je sais donc que cron est en cours d'exécution.
Mon script:
#!/bin/bash
sleep 5
gsettings set org.gnome.desktop.background picture-uri
file:///home/zak/Pictures/Wallpaper/DOU2.xml
sleep 1
gsettings set org.gnome.desktop.background picture-uri
file:///home/zak/Pictures/Wallpaper/DOU.xml
sleep 1
mkdir /home/zak/iscronworking
exit
Est-ce que Cron ne peut pas accéder à gsettings
? Le travail est sur mon utilisateur crontab donc il ne devrait pas être exécuté en tant que root.
Apparemment, gsettings
nécessite la définition de certaines variables. Comme CRON utilise uniquement un ensemble très restreint de variables d’environnement, vous devez les définir avant votre script. Utilisez le code suivant dans votre ligne CRON.
30 */2 * * * DISPLAY=:0 GSETTINGS_BACKEND=dconf /your/path/your-script.sh
Dans l'exemple, le travail est configuré pour s'exécuter toutes les 2 heures à la 30e minute. J'ai essayé d'insérer les variables dans le script, pour une ligne plus nette, sans résultat, si quelqu'un trouve un moyen de le faire, faites-le nous savoir.
Trébuché avec ces paramètres dans forums ArchLinux .
La solution ci-dessus ne fonctionne plus avec Vivid .
La meilleure façon de faire en sorte que cela fonctionne est en effet de trouver la variable DBUS_SESSION_BUS_ADDRESS
. Dans le script suivant, j'utilise une boucle for
pour effectuer le travail car elle utilise pidof
d'une application spécifique telle que gnome-session
ne fonctionne pas toujours pour moi et les applications les plus récentes ont un DBUS ADDRESS
différent probablement parce que, dans mon cas particulier, je démarre des démons au démarrage avec mon nom d'utilisateur. Pour changer efficacement le fond d'écran, j'utilise dconf
mais vous pouvez également utiliser gsettings
. Alors ajustez le script à votre cas d'utilisation.
#!/bin/bash -e
user=$(whoami)
fl=$(find /proc -maxdepth 2 -user $user -name environ -print -quit)
while [ -z $(grep -z DBUS_SESSION_BUS_ADDRESS "$fl" | cut -d= -f2- | tr -d '\000' ) ]
do
fl=$(find /proc -maxdepth 2 -user $user -name environ -newer "$fl" -print -quit)
done
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS "$fl" | cut -d= -f2-)
if [ $# -gt 0 ]
then
PICS_PATH=$1
else
PICS_PATH="/home/public/Pictures/Wallpaper/"
fi
IMG=$(find -L $PICS_PATH -name "*.jpg" -o -name "*.png" | shuf -n1)
#gsettings set org.gnome.desktop.background picture-uri "file://${IMG}"
dconf write "/org/gnome/desktop/background/picture-uri" "'file://${IMG}'"
echo -e "$(date): ${IMG}" >> /tmp/wallch.log
dans crontab, ajoutez la ligne suivante pour changer le fond d'écran toutes les heures paires
0 */2 * * * /path/to-above-script.sh /path/to-wallpapers/
Cela est dû au fait que cron utilise uniquement un ensemble très restreint de variables d’environnement. La seule variable d'environnement chargée d'exécuter correctement le script de la question lorsque celle-ci est définie en tant que tâche périodique est DBUS_SESSION_BUS_ADDRESS
, et non DISPLAY
ou GSETTINGS_BACKEND
ou quelque chose d'autre.
Vous devez donc exporter la variable d’environnement DBUS_SESSION_BUS_ADDRESS
dans votre script. Voir plus d'explications dans ma réponse ici .
En fin de compte, votre script devrait ressembler à:
#!/bin/bash
PID=$(pgrep gnome-session)
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ|cut -d= -f2-)
sleep 5
gsettings set org.gnome.desktop.background picture-uri file:///home/zak/Pictures/Wallpaper/DOU2.xml
sleep 1
gsettings set org.gnome.desktop.background picture-uri file:///home/zak/Pictures/Wallpaper/DOU.xml
J'ai commencé à avoir le même problème il y a environ un mois. J'ai également créé un script qui utilise gsettings
pour changer l'arrière-plan du bureau dans Gnome Shell/Unity.
L'exécution manuelle de cette commande met immédiatement à jour l'arrière-plan du bureau. J'utilise également cron pour planifier l'exécution de mon script:
0,30 * * * * DISPLAY=:0.0 nextwall /home/serrano/Pictures/backgrounds/
Comme dans votre cas, cron exécute le script avec succès et le nouvel URI de fond d'écran est correctement défini dans gsettings
. Vous pouvez le tester en lançant:
gsettings get org.gnome.desktop.background picture-uri
Cependant, l’arrière-plan du bureau n’est pas mis à jour lorsque cron exécute le script (cela fonctionnait jusqu’à il ya environ un mois). Fait intéressant, lorsque je clique avec le bouton droit de la souris sur mon bureau et que je sélectionne "Changer le fond du bureau", l’arrière-plan du bureau est soudainement mis à jour pour afficher la bonne image.
Donc, pour une raison quelconque, le fait de modifier l’arrière-plan du bureau à partir de cron ne déclenche plus la mise à jour par Nautilus de l’arrière-plan du bureau. Je suppose que c'est un bogue, alors je viens de déposer un rapport de bogue pour ce problème: https://bugs.launchpad.net/ubuntu/+source/nautilus/+bug/1033034
Veuillez cliquer sur le lien "Ce bogue vous affecte-t-il?" lien si vous avez le même problème.