xfconf-query在crontab中执行无效的问题求助
我遇到了一个挺困扰的问题,想请大家帮忙排查下:
我写了一个名为/usr/bin/disable-sleep的脚本,内容如下:
#!/bin/sh xfconf-query -c xfce4-power-manager -p /xfce4-power-manager/blank-on-ac -s 0 now=$(date +"%D %T") echo "disable sleep $now" >> ~/cron.log
接着设置了一条cron定时任务,每天早上6点自动执行这个脚本:
0 6 * * * /usr/bin/disable-sleep
早上查看~/cron.log的时候,日志正常生成了,时间戳也完全正确,但xfce4-power-manager的屏幕空白设置根本没变化,这到底是哪里出问题了?
问题原因分析
这其实是cron执行环境的典型问题:cron在运行任务时,不会加载用户登录后的完整环境变量,而xfconf-query需要依赖DISPLAY和DBUS_SESSION_BUS_ADDRESS这两个关键变量,才能正确连接到XFCE的会话配置服务。缺少这两个变量的话,命令就算执行了,也没法对当前用户的XFCE设置生效。
解决方案
这里有几种可行的解决方法,你可以根据自己的情况选择:
在脚本中添加环境变量
先在你的终端里执行以下命令,获取当前用户的环境变量值:echo $DISPLAY echo $DBUS_SESSION_BUS_ADDRESS一般来说
DISPLAY的值是:0,DBUS_SESSION_BUS_ADDRESS会是类似unix:path=/run/user/1000/bus(其中1000是你的用户UID,可以用id -u命令查看)。把这两个变量加到你的脚本开头,修改后的脚本如下:
#!/bin/sh export DISPLAY=:0 export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus xfconf-query -c xfce4-power-manager -p /xfce4-power-manager/blank-on-ac -s 0 now=$(date +"%D %T") echo "disable sleep $now" >> ~/cron.log在cron任务中直接指定环境变量
不用修改脚本,直接在cron命令前加上需要的环境变量:0 6 * * * DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus /usr/bin/disable-sleep通过su命令加载用户登录环境
使用su -l命令切换到你的用户并加载完整环境,再执行脚本:0 6 * * * su -l your_username -c "/usr/bin/disable-sleep"记得把
your_username替换成你实际的用户名。
测试建议
修改后可以手动执行一下脚本(带上环境变量),比如:
DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus /usr/bin/disable-sleep
然后去XFCE的电源管理设置里看看,确认屏幕空白选项是否已经被改成0了,没问题的话再等待cron自动执行验证效果。
备注:内容来源于stack exchange,提问作者Hans Yulian

