Cron not able to succesfully change background

5,986

Solution 1

Apparently gsettings needs some variables to be set. Because CRON uses only a very restricted set of environment variables you must set them before your script. Use the following code in your CRON line.

30 */2 * * * DISPLAY=:0 GSETTINGS_BACKEND=dconf /your/path/your-script.sh

In the example the job is set to run every 2 hours on the 30th minute. I've tried to insert the variables into the script, for a cleaner line, with no result, if someone find a way to do that, let us know.

Stumbled with these settings in ArchLinux forums.

The above solution no longer works with Vivid.

The best way to get this to work is indeed to find DBUS_SESSION_BUS_ADDRESS variable, in the following script I'm using a for loop to do the job because using pidof of a specific application like gnome-session doesn't always work for me and the newers applications have a different DBUS ADDRESS probably because, in my particular case, I'm starting some daemons on boot with my user name. To effectively change the wallpaper I'm using dconf but you can also use gsettings. So tweak the script to your use case.

#!/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

in crontab add the following line to change wallpaper every even hour

0 */2 * * * /path/to-above-script.sh /path/to-wallpapers/

Solution 2

This is happen because cron uses only a very restricted set of environment variables. The only one environment variable that is responsible for running in the right way the script from the question when this is set as a cron job is DBUS_SESSION_BUS_ADDRESS, not DISPLAY or GSETTINGS_BACKEND or something else.

So, you must to export DBUS_SESSION_BUS_ADDRESS environment variable in your script. See more explanations in my answer here.

In the end, your script should look like:

#!/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
Share:
5,986

Related videos on Youtube

Solenoid
Author by

Solenoid

Updated on September 18, 2022

Comments

  • Solenoid
    Solenoid over 1 year

    I'm running 12.04 with a custom XML background (modification on Day of Ubuntu) that changes based on time of day. I've noticed that there's a significant delay between when the changes are scheduled to take place in the XML file and when they actually show up on the background. I've also noticed that when I resume from suspend I don't get the correct background image either. I've found that cycling the wallpaper manually will fix this, and I've written a script to automate the process.

    If I execute the script manually it works fine. However, when I schedule the script to run in cron, cron doesn't change the background. To make sure that the script was being run properly by cron, I had it create a directory in my home folder after running the background change, and the directory is created successfully, so I know cron is running and executing the script.

    My 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
    

    Is cron just not able to access gsettings? The job is on my user crontab so it shouldn't be running as root.

  • DumbCoder21
    DumbCoder21 over 10 years
    the only correct answer...
  • Mark
    Mark about 10 years
    Wish I had found this about 90 min ago
  • Raab70
    Raab70 almost 9 years
    If anyone has other users logging into their machine I recommend using PID=$(pgrep -u $USER gnome-session) to avoid changing other people's backgrounds.
  • SimonT
    SimonT about 8 years
    @Raab70 I've tested this on Linux Mint and the variable $USER seems to be unavailable in a crontab job. (Also on mint the process to pgrep for is cinnamon-session, with the -f flag because of the length of the process name).