Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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?

share|improve this question
    
Try out cronmaker.com , there you can make cron-expressions and put it with crontab -e – We are Borg Feb 23 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 at 10:55
1  
By the way, what's the url for the space backgrounds? – bohdan_trotsenko Mar 1 at 9:58
up vote 16 down vote accepted

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.

share|improve this answer
    
Well, that works. Thanks! – Aleksander Mahnyov Feb 23 at 16:46
1  
It's so much better to use a cron job. – Luka Ramishvili Feb 24 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 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 at 7:43
2  
I Just looked: cpu 0.0% What tax are we talking about? – Jacob Vlijm Feb 24 at 7:44

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.

share|improve this answer
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 at 16:12
    
@JacobVlijm If any additional variable is needed, OP can define those in the script, no neeed for cron.. – heemayl Feb 23 at 16:15
    
Absolutely, but it can be tricky, and not so straightforward to set up (find out) sometimes. – Jacob Vlijm Feb 23 at 16:16
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 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 at 12:24

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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