Crontab定时执行GNOME壁纸切换Shell脚本失败求助
Crontab定时执行GNOME壁纸切换Shell脚本失败求助
我来帮你分析下问题所在哈!你遇到的情况其实很常见——脚本直接在终端跑没问题,但通过crontab执行就失效,核心原因是crontab的执行环境和你登录桌面后的shell环境完全不一样。
GNOME的gsettings命令依赖桌面会话的环境变量才能和GNOME后台通信,而crontab运行时是极简的系统环境,缺少DISPLAY和DBUS_SESSION_BUS_ADDRESS这两个关键变量,导致脚本没法正常调用GNOME的壁纸设置接口。
下面给你几个可行的解决方案:
方案1:在脚本里添加必要的环境变量
- 先在你的终端里执行以下命令,获取当前用户的环境变量值:
echo $DISPLAY # 通常输出是:0 echo $DBUS_SESSION_BUS_ADDRESS # 一般是unix:path=/run/user/你的UID/bus,比如unix:path=/run/user/1000/bus - 修改你的
background_night.sh脚本,在开头加上这两个环境变量的导出:#!/bin/bash # 添加GNOME会话所需的环境变量 export DISPLAY=:0 export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus # 替换成你自己获取到的地址 wallpaper="$HOME/Bilder/Hintergründe/appa_night.jpg" gsettings set org.gnome.desktop.background picture-uri-dark file:///"$wallpaper"
方案2:在crontab里直接指定环境变量
不需要修改脚本,直接在crontab的定时任务行里加上环境变量:
00 20 * * * DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus $HOME/Bilder/Hintergründe/.background_skript/background_night.sh
方案3:用su命令模拟用户登录环境执行脚本
这种方法会加载你用户的完整环境变量,适合不想手动找环境变量的情况:
00 20 * * * su - seb -c '$HOME/Bilder/Hintergründe/.background_skript/background_night.sh'
额外处理:消除“No MTA installed”提示
syslog里的这个提示是因为crontab会把脚本的输出(包括错误信息)尝试通过邮件发送,但你没安装邮件服务器。可以在定时任务末尾加上输出重定向,把输出丢弃:
00 20 * * * DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus $HOME/Bilder/Hintergründe/.background_skript/background_night.sh >/dev/null 2>&1
修改完后,保存crontab(crontab -e编辑后按Ctrl+O保存,Ctrl+X退出),可以设置一个1分钟后的测试任务验证是否生效哦!
备注:内容来源于stack exchange,提问作者Sebastian Illi
相关产品推荐
相关产品推荐

