因此我尝试通过 crontab 运行 shell 脚本。
我的 Crontabs 如下所示:
00 20 * * * $HOME/Bilder/Hintergründe/.background_skript/background_night.sh
我的 background_day.sh 如下所示:
`#!/bin/bash wallpaper="$HOME/Bilder/Hintergründe/appa_night.jpg"
gsettings 设置 org.gnome.desktop.background picture-uri-dark file:///"$wallpaper"`
我已经使用以下方式分配了 chmod 权限:chmod +x background_night.sh
。
如果我直接用 shell 运行它,它也能正常工作。
grep CRON /var/log/syslog 如下所示:
May 25 15:07:01 sebs-thinkpad CRON[90433]: (seb) CMD (sh /home/seb/Bilder/Wallpaper/.background_skript/background_night.sh) May 25 15:08:01 sebs-thinkpad CRON[90472]: (CRON) info (No MTA installed, discarding output)
我不知道我做错了什么。
答案1
用来> cron.log 2>&1
让 cronjob 将其输出写入文件,以便您可以看到它生成的错误消息。(当邮件不可用时,某些 cron 守护程序会自动将输出写入系统日志;您的守护程序显然不会这样做。)
最有可能的问题是 'gsettings set' 通过 D-Bus 工作(会议总线(具体来说,不是系统总线)并且通常需要存在DBUS_SESSION_BUS_ADDRESS
或环境变量之一(取决于设置)。XDG_RUNTIME_DIR
首先,不过:
如果您的系统有
systemctl --user
可用资源,请考虑使用其.timer
单元,因为您的图形桌面很可能已经将必要的环境变量转发到您的 systemd 每个用户管理器中。如果您不想处理 .timer 和 .service 单元,您可以使用
systemd-run
crontab 在正确的环境中启动脚本:00 20 * * * systemd-run --user ~/Bilder/Hintergründe/.background_skript/background_night.sh
如果你想通过 cron 完成所有事情:
echo $DBUS_SESSION_BUS_ADDRESS
在终端窗口中运行并检查显示的路径。如果总线路径显示为
/run/user/XXX/bus
,则其位置是静态的 - 您可以将以下内容之一放在 cronjob 的顶部(或者,将export
它们放在脚本的开头):XDG_RUNTIME_DIR="/run/user/XXX" DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/XXX/bus"
(通常 XDG_RUNTIME_DIR 足以覆盖 D-Bus 以及其他各种组件。)
如果总线路径显示为
/tmp/dbus-XXXXXXX
,则它是动态的 – 您需要在每次登录时将该值存储在某处:编辑
~/.xprofile
或~/.xinitrc
(以适用者为准)将环境存储在文件中:echo "$DBUS_SESSION_BUS_ADDRESS" > /tmp/dbus.env echo "$DISPLAY" > /tmp/display.env
编辑脚本以从文件加载环境:
export DBUS_SESSION_BUS_ADDRESS=$(< /tmp/dbus.env) export DISPLAY=$(< /tmp/display.env)
答案2
所有用户的 Cron 任务均由 root 运行。这意味着某些个人快捷方式不合适:
$HOME
必须用明确路径替换。~/
还有。- root使用
$PATH
的不是您自己定制的$PATH
。对可执行文件使用完整路径。 - 您的环境中的变量可能不存在于根环境中。