Ubuntu Crontab中执行gsettings命令的问题

在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命令就可以生效了。

Leave a Comment

豫ICP备19001387号-1