设置cron以运行shell脚本:来自网页的随机壁纸

我编写了一个shell脚本,可以从网页下载随机壁纸,并每隔5小时将其设置为一个背景。 这是脚本:

#!/bin/bash countervar=1; finish=0; cd /home/guinness/.rwallpaper/ if [ -f counter ] then countervar=`cat counter` fi for (( i=$countervar; c "counter" if [ ! -f wallpaper-$i.jpg ] then wget "http://ubuntu.miximages.com/command-line/wallpaper-$i.jpg" if [ -f wallpaper-$i.jpg ] then gsettings set org.gnome.desktop.background picture-uri "file:///home/guinness/.rwallpaper/wallpaper-$i.jpg" exit fi fi done 

如果我运行这个脚本,它就像一个魅力。 我每隔5小时用cron运行一次。 问题是,它每5个小时运行一次并成功下载下一个图像,但不会将其设置为壁纸。 谁能告诉我可能是什么问题?

这是因为cron只使用一组非常有限的环境变量。 当设置为cron作业时,唯一一个负责以正确的方式运行问题的环境变量是DBUS_SESSION_BUS_ADDRESS

因此,您必须在脚本中导出DBUS_SESSION_BUS_ADDRESS环境变量。 请在此处查看我的答案中的更多解释。

最后,您的脚本应如下所示:

 #!/bin/bash PID=$(pgrep gnome-session) export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ|cut -d= -f2-) countervar=1; finish=0; cd /home/guinness/.rwallpaper/ if [ -f counter ] then countervar=`cat counter` fi for (( i=$countervar; c<=2000000; i++ )) do echo $i > "counter" if [ ! -f wallpaper-$i.jpg ] then wget "http://ubuntu.miximages.com/command-line/wallpaper-$i.jpg" if [ -f wallpaper-$i.jpg ] then gsettings set org.gnome.desktop.background picture-uri "file:///home/guinness/.rwallpaper/wallpaper-$i.jpg" exit fi fi done 

您遇到的问题几乎可以肯定,脚本的后台切换部分依赖于X会话中的环境变量。 Cron没有设置任何环境变量,因此这将打破脚本的这一部分。

要解决这个问题,你可以将脚本放入一个大约五个小时的睡眠状态的while循环中,然后将脚本调用到/etc/X11/Xsession.d/my_script或〜/ .xprofile这样的位置。