web-dev-qa-db-fra.com

Configuration de cron pour exécuter un script shell: fond d'écran aléatoire d'une page Web

J'ai écrit un script Shell qui télécharge du papier peint au hasard à partir d'une page Web et le définit comme arrière-plan toutes les 5 heures. Voici le script:

#!/bin/bash

countervar=1;
finish=0;
cd /home/guinness/.rwallpaper/
if [ -f counter ]
then
    countervar=`cat counter`
fi

for (( i=$countervar; c<=2000000; i++ ))
do
   echo $i > "counter"
   if [ ! -f wallpaper-$i.jpg ]
   then
    wget "http://wallpapers.wallbase.cc/rozne/wallpaper-$i.jpg"

    if [ -f wallpaper-$i.jpg ]
    then
        gsettings set org.gnome.desktop.background picture-uri "file:///home/guinness/.rwallpaper/wallpaper-$i.jpg"
        exit
    fi
   fi
done

Si je lance un script, cela fonctionne comme un charme. J'utilise cron pour l'exécuter toutes les 5 heures. Le problème, c'est qu'il s'exécute toutes les 5 heures et télécharge avec succès l'image suivante, mais ne le définit pas comme fond d'écran. Quelqu'un peut-il me dire quel peut être le problème?

2
DalekSupreme

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 à partir de la question lorsqu'elle est définie en tant que tâche périodique est DBUS_SESSION_BUS_ADDRESS.

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-)

countervar=1;
finish=0;
cd /home/guinness/.rwallpaper/
if [ -f counter ]
then
    countervar=`cat counter`
fi

for (( i=$countervar; c<=2000000; i++ ))
do
   echo $i > "counter"
   if [ ! -f wallpaper-$i.jpg ]
   then
    wget "http://wallpapers.wallbase.cc/rozne/wallpaper-$i.jpg"

    if [ -f wallpaper-$i.jpg ]
    then
        gsettings set org.gnome.desktop.background picture-uri "file:///home/guinness/.rwallpaper/wallpaper-$i.jpg"
        exit
    fi
   fi
done
4
Radu Rădeanu

Le problème que vous rencontrez est presque certainement que la partie de votre script relative à la commutation en arrière-plan repose sur des variables d'environnement de votre session X. Cron ne définit aucune variable d'environnement, donc cela va casser cette partie du script.

Pour résoudre le problème, vous pouvez placer le script dans une boucle while avec une veille d'environ cinq heures, puis appeler votre script dans un emplacement tel que /etc/X11/Xsession.d/my_script ou ~/.xprofile.

1
xyrix