在Ubuntu下你可能会有这么个需求,定时更换壁纸,或者定时设置系统代理,首先想到的应该是通过Crontab定时任务去执行gsettings
命令,这样可以做到更换壁纸或设置系统代理。
脚本写好了,手动测试下没有问题,设置好Crontab让它定时执行,到了设置的时间点,定时任务也执行了,也没报错,但就是没有生效。
问题出在哪呢?
跟Windows下的计划任务不一样,Linux下的Cron是一个特殊的受限制的环境,gsettings
命令需要传递的DBUS_SESSION_BUS_ADDRESS
变量它没有。
所以解决方法就是把DBUS_SESSION_BUS_ADDRESS
变量export给它。
在shell脚本中加两行代码即可
PID=$(pgrep -o gnome-shell)
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ|cut -d= -f2-)
这两行代码针对的是Debian/Ubuntu下的Gnome桌面环境,其它环境需要做修改才可以。
Crontab下次执行的时候gsettings
命令就可以生效了。