13

I have a .sh script that downloads a photo from Japanese satellite's server and sets it as a background picture. I've put it into startup list, but how do I run it every, like, 5 minutes, automatically?

muru
  • 193,181
  • 53
  • 473
  • 722
Aleksander Mahnyov
  • 149
  • 1
  • 1
  • 4
  • 1
    Try out cronmaker.com , there you can make cron-expressions and put it with crontab -e – We are Borg Feb 23 '16 at 16:09
  • 2
    Does the picture even change every 5 minutes? Try using an interval that creates less unnecessary load on the target server. Or make sure you only download if the file is really changed. – til_b Feb 24 '16 at 10:55
  • 1
    By the way, what's the url for the space backgrounds? – bohdan_trotsenko Mar 01 '16 at 09:58

2 Answers2

29

Put it in your crontab.

Open your cron table by:

crontab -e

Now add:

*/5 * * * * /path/to/script.sh

Don't forget to make the script executable beforehand.


As your script depends on X, probably will be a good idea to add the DISPLAY to the script's environment:

*/5 * * * * DISPLAY=:0 /path/to/script.sh

Replace :0 with your actual DISPLAY (can be found by echo $DISPLAY from interactive session).

If needed, you can add the XAUTHORITY environment variable too:

*/5 * * * * DISPLAY=:0 XAUTHORITY="~/.Xauthority" /path/to/script.sh

Again you can find the value by echo $XAUTHORITY.

heemayl
  • 90,425
  • 20
  • 200
  • 267
17

The lazy option

If you want the easy way, and avoid having to find out which environment variable to set:

  • Make sure your script includes the shebang
  • Make it executable
  • Add the following to Startup Applications:

    /bin/bash -c "sleep 15 && while true; do <path_to_your_script.sh> ; sleep 300; done"
    

    Dash > Startup Applications > Add. Add the command:

    /bin/bash -c "sleep 15 && while true; do <path_to_your_script.sh> ; sleep 300; done"
    

Explanation

If you run the script from your own environment (e.g. from a terminal window or from Startup Applications), a number of environment variables will be set. cron however runs your script with a limited set of environment variables.
Since your script no doubt uses the gsettings command:

gsettings get org.gnome.desktop.background picture-uri <wallpaper>

to set the wallpaper, almost certainly the command will break when run from cron.

The downside of "the lazy solution" is purely theoretical. A command that sleeps practically continuously means nothing to your system.

Additional info; alternatively

Reading this post, and from experiences in the past, I am pretty sure the DBUS_SESSION_BUS_ADDRESS environment variable needs to be set.

To do so, add the following section at the beginning of your script (below the shebang):

PID=$(pgrep gnome-session)
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ|cut -d= -f2-)

Then you should be able to successfully run it from cron.

You could however very well save the hustle, and choose the lazy option.

Jacob Vlijm
  • 82,471
  • 12
  • 195
  • 299
  • @AleksanderMahnyov You' re welcome. Glad it works :) – Jacob Vlijm Feb 23 '16 at 16:47
  • Ah, fun, a downvote. Care to share *why*? – Jacob Vlijm Feb 23 '16 at 19:11
  • 2
    It's so much better to use a cron job. – Luka Ramishvili Feb 24 '16 at 07:01
  • 1
    @LukaRamishvili Thanks for the comment. However: a. And why is that? a sleeping command means *nothing* to your system. b. I even included the option. – Jacob Vlijm Feb 24 '16 at 07:06
  • I didn't see the mention of cron. As your answer is the accepted one, it would be better to add instructions for cron. There are multiple reasons why you'd prefer using cron; I can give you a few - that's the standard way for scheduled tasks; if the system restarts, it will still continue to run; crashing once won't affect subsequent runs (you won't have to check if it's still running); it already has features you may otherwise end up re-implementing, e.g. running on the same time every day, running as a different user, etc. – Luka Ramishvili Feb 24 '16 at 07:15
  • @LukaRamishvili a. deliberately including (parts of) answers of others is a bad thing, the fact that this is the accepted answer does not change that. b. The option runs the command only for this user (startup applications is local) , no multiple runs of the command (other users even wont't want it) . c. If the system restarts it will run. – Jacob Vlijm Feb 24 '16 at 07:32
  • @JacobVlijm a. you can post an update with attribution and link to the other answer, pretty standard b. every user has her own cron, and I didn't mention any other users c. I don't see 'no multiple runs' as a benefit, both ways impose minimal tax on the system. – Luka Ramishvili Feb 24 '16 at 07:42
  • 1
    Otherwise, nice research about the gnome session variables, it would help the OP a lot, since that would be required either way. – Luka Ramishvili Feb 24 '16 at 07:43
  • 2
    I Just looked: `cpu 0.0%` What tax are we talking about? – Jacob Vlijm Feb 24 '16 at 07:44