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

设置 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<=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 等位置。

相关内容