web-dev-qa-db-fra.com

Cron pas capable de changer de fond avec succès

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.

7
Solenoid

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/
10
perdigueiro

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
7
Radu Rădeanu

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.

0
Serrano