11

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?

  • 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 1 '16 at 9:58
14

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.

  • @AleksanderMahnyov You' re welcome. Glad it works :) – Jacob Vlijm Feb 23 '16 at 16:47
  • 1
    It's so much better to use a cron job. – Luka Ramishvili Feb 24 '16 at 7: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 7:06
  • 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 7:43
  • 2
    I Just looked: cpu 0.0% What tax are we talking about? – Jacob Vlijm Feb 24 '16 at 7:44
23

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.

  • 1
    Not sure if it works with limited environment variables of cron, but let' s see if OP mentions it works :) – Jacob Vlijm Feb 23 '16 at 16:12
  • 1
    @AleksanderMahnyov Please edit your question to add the script, hard to say without seeing the contents..possibly a DISPLAY (and/or XAUTHORITY) issue.. – heemayl Feb 23 '16 at 16:29
  • 1
    @Kartagis Cron can not handle seconds, also you are trying to do for hours which is still syntactically wrong.. – heemayl Feb 24 '16 at 12:24
  • 1
    I love this method rather than the "lazy method", because I knew about cron, but needed a bit of a refresher course. This is exactly what I did, thanks a lot! :) – ZaxLofful Sep 9 '17 at 22:22
  • 2
    Better approach than the accepted answer. :) – Sandeep Kumar Jun 5 '18 at 11:39

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.