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?
-
1Try out cronmaker.com , there you can make cron-expressions and put it with crontab -e– We are BorgFeb 23, 2016 at 16:09
-
2Does 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_bFeb 24, 2016 at 10:55
-
1By the way, what's the url for the space backgrounds?– bohdan_trotsenkoMar 1, 2016 at 9:58
2 Answers
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
.
-
1Not sure if it works with limited environment variables of cron, but let' s see if OP mentions it works :) Feb 23, 2016 at 16:12
-
1
-
1@Kartagis Cron can not handle seconds, also you are trying to do for hours which is still syntactically wrong..– heemaylFeb 24, 2016 at 12:24
-
2I 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! :) Sep 9, 2017 at 22:22
-
2
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.
-
-
2
-
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. Feb 24, 2016 at 7:06
-
1Otherwise, nice research about the gnome session variables, it would help the OP a lot, since that would be required either way. Feb 24, 2016 at 7:43
-
2