This is a fun little script that I wrote to rotate the wallpaper on my linux (ubuntu) machine. While not strictly on topic, you can use this as a template for your own scripts, such as those that monitor for file changes.
We need two files, one to periodically rotate the wallpaper and the other to start the rotating script in the background and exit.
But first, setup a directory to put your wallpaper pictures in:
mkdir -p ~/Pictures/wallpaper
Here is the background script to change the wallpaper periodically (put in a file named
#!/bin/sh WALLPAPER_DIR=~/Pictures/wallpaper while true do image=`ls $WALLPAPER_DIR | shuf -n 1` echo "Changing to image $image" gsettings set org.gnome.desktop.background picture-uri "file://$WALLPAPER_DIR/$image" sleep 60 done
This is the wrapper script to run
rotateWallpaper in the background (put in a file named
#!/bin/bash if [ ! -f /tmp/rotateWallpaper.pid ]; then PROGRAM=/usr/local/google/home/msnider/bin/rotateWallpaper.sh echo $PROGRAM > /tmp/rotateWallpaper.error nohup $PROGRAM 2>/tmp/rotateWallpaper.error 1>/dev/null & PID=$! echo $PID > /tmp/rotateWallpaper.pid fi exit 0
Make sure both files have execute permission for the current user:
chmod u+x ~/bin/rotateWallpaper chmod u+x ~/bin/launchWallpaper
launchWallpaper from someplace that loads when your machine starts up. I add the following to my bash
#... ~/bin/launchWallpaper #...
There are a lot of ways to launch a script on startup (do a quick google search), but I choose to use my bash profile, because I always open a terminal on my machines. The
launchWallpaper script will be called each time a new bash profile is started (such as opening a new terminal window), so the script needs to keep track if it is already started. For that reason the process ID of
rotateWallpaper is stored as
/tmp/rotateWallpaper.pid. The first thing
launchWallpaper does is check for the existence of the PID, only continuing if it doesn’t exist yet. This file will be automatically deleted when the machine is rebooted. Manually delete it if you terminate the PID and want to restart the script.
The launcher script then executes
rotateWallpaper, sending errors to
/tmp/rotateWallpaper.error (also cleared on reboot) and standard output to
rotateWallpaper is launched using
nohup, so it keeps running if terminal is closed, and using (
&) to put it in the background. The
$! command is used to fetch the PID of the last run script and stored as
launchWallpaper exits without an error, so that whatever calls it is not blocked.
rotateWallpaper script runs indefinitely with a sleep (specified in seconds) between each execution. To find an image the code lists every file in the wallpaper directory and randomly chooses one (don’t put anything else in that directory or errors will ensue). The
gsettings is a gnome command that switches the wallpaper from the command line and is available on ubuntu.
shuf commands don’t work on OSX, and none of this will work on windows. If you have similar scripts for other environments, please post in the comment section ^_^
Not interested in a script to rotate you’re wallpaper, but still want to learn something from this article. Well, there are a couple of good take aways. First, having a wrapper script to fetch and store the PID of a long-running script is very useful and something that unix processes have been doing forever. Second, by starting the
rotateWallpaper script is the background and exiting without error from the wrapper script, we’ve successful put the long-running script in the background until reboot or it is manually killed. Together these two techniques can be used to start servers, run monitoring scripts, and many other useful tools.