我编写了一个 shell 脚本,它每 5 小时从网页下载随机壁纸并将其设置为背景。脚本如下:
#!/bin/bash
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://wallpapers.wallbase.cc/rozne/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
如果我运行这个脚本,它会运行得非常好。我使用 cron 每 5 小时运行一次。问题是,它每 5 小时运行一次并成功下载下一张图片,但不会将其设置为壁纸。有人能告诉我问题出在哪里吗?
答案1
这是因为 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://wallpapers.wallbase.cc/rozne/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
答案2
您遇到的问题几乎肯定是脚本的后台切换部分依赖于 X 会话中的环境变量。Cron 不会设置任何环境变量,因此这会破坏脚本的这一部分。
为了解决这个问题,您可以将脚本放入 while 循环中,休眠大约五个小时,然后将脚本放在 /etc/X11/Xsession.d/my_script 或 ~/.xprofile 等位置。