从壁纸纹丝不动到每小时自动换景:dynamic-wallpaper 定时任务实战与避坑记录
【免费下载链接】dynamic-wallpaperA simple bash script to set wallpapers according to current time, using cron job scheduler.项目地址: https://gitcode.com/gh_mirrors/dy/dynamic-wallpaper
dynamic-wallpaper 是一个用 bash 编写的轻量级动态壁纸工具,它依靠 cron 定时任务调度器根据当前时间自动更换桌面壁纸,内置二十多套按小时编排的壁纸主题。这篇文章不打算罗列"常见错误清单",而是想带你完整走一遍"安装→配置定时任务→日常使用→排查故障"的真实路径,把最容易绊倒新手的坑,埋在你第一次动手的每一步里。
一个清晨的"壁纸事故"
想象这样一个早晨:你掀开电脑,期待看到清晨的阳光洒在桌面上,结果屏幕还停留在昨晚那张深蓝色的极光——壁纸纹丝不动。于是你打开搜索框,输入"Linux 动态壁纸自动更换",最终找到了 dynamic-wallpaper:一个把壁纸按小时编排好、交给 cron 定时任务去执行的 bash 小工具。它的想法很简单:每个壁纸主题里都有 24 张图,分别对应一天中的 0 点到 23 点,cron 每到整点调用一次dwall,桌面就跟着时间"换装"。
听起来不复杂,但真正动手时,你可能会在依赖、cron 环境变量、Wayland 兼容这些环节上各摔一跤。别急,我们一步步来。
装好工具前的"三件套"准备
在安装之前,先说说 dynamic-wallpaper 依赖什么,以及为什么需要它们:
- feh:负责把壁纸真正"铺"到屏幕上,这是它在窗口管理器下的主力工具;
- cron:定时任务调度器,相当于给 dwall 上了发条的"闹钟",没有它壁纸就不会自动换;
- xrandr:查询显示器信息,XFCE 桌面环境切换壁纸时会用到它。
先补齐这三样,免得安装后一运行就报"找不到依赖":
# Debian / Ubuntu 系 sudo apt install feh x11-xserver-utils cron # Arch 系 sudo pacman -S feh xorg-xrandr cronie小提示:如果你只想先体验一下效果,仓库里自带了
test.sh,它可以在不安装的情况下直接在当前目录跑,适合"先看再买"。
安装与第一次运行:看清"0-23"的换图逻辑
克隆仓库并预演一遍:
git clone https://gitcode.com/gh_mirrors/dy/dynamic-wallpaper cd dynamic-wallpaper chmod +x test.sh install.sh # 先试跑 beach 风格,确认当前时刻应该显示哪张图 ./test.sh -s beach觉得不错,再正式安装:
./install.sh安装脚本做的事很朴素:把images目录和dwall.sh复制到/usr/share/dynamic-wallpaper,然后在/usr/bin下建立dwall软链接。所以安装完成后,你可以在任何目录直接执行:
dwall -s firewatch如果屏幕上的壁纸立刻变成了火警瞭望塔的风景,说明工具本身工作正常。此时它的工作流程是:脚本读取当前小时数(比如下午 3 点),去firewatch目录里找3.jpg或3.png,再用对应的桌面环境命令把它设成壁纸。你甚至可以看一眼缓存文件确认它选了哪张:
cat ~/.cache/dwall_current这就是"按小时换图"的全部秘密:没有复杂的算法,只有一张时间表——而那张"时间表",正是接下来要配置的 cron 定时任务。
让定时任务真正"跑起来":cron 配置的完整链路
很多用户卡在最后一步:手动执行dwall -s xxx一切正常,但桌面就是不自动换。问题几乎都出在同一个地方——cron 运行时的环境和你终端里的环境不一样。
为什么 cron "看不见"你的显示器
cron 守护进程由系统启动,它不知道你在哪个桌面会话登录,也不知道你的DISPLAY变量是什么。而壁纸工具恰恰需要这些信息才能"找到"屏幕。你可以先把自己当前的环境变量抄下来:
echo "$SHELL | $PATH | $DISPLAY | $DESKTOP_SESSION | $DBUS_SESSION_BUS_ADDRESS | $XDG_RUNTIME_DIR"把输出里的值记好,稍后写 cron 任务时要原样搬进去。
写一条"每小时换一次"的 cron 任务
用crontab -e打开编辑(首次会提示选择编辑器,选 vim 或 nano 都行),加入这样一行:
0 * * * * env PATH=/usr/local/bin:/usr/bin DISPLAY=:0 DESKTOP_SESSION=gnome DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/1000/bus" /usr/bin/dwall -s firewatch逐段拆解一下这行命令,你就不会再怕它了:
0 * * * *:每小时的第 0 分钟执行一次,也就是整点换壁纸;env ...:cron 的"快递专线",把终端里才有的环境变量显式传给dwall,其中DISPLAY=:0最关键;/usr/bin/dwall -s firewatch:真正干活的命令,风格名可以换成任何你喜欢的主题。
如何确认定时任务真的在跑
配置完成后,做两个体检:
# 看任务是否写入成功 crontab -l | grep dwall # 看 cron 服务本身是否在运行(Arch 上是 cronie.service) systemctl status cron如果服务没启动,先拉起来再设开机自启:
sudo systemctl start cron sudo systemctl enable cron到这里,你的壁纸已经进入了"每小时自动换装"的节奏。接下来是一些让体验更顺手的小技巧。
日常进阶:从"能换"到"好用"
快速查看与切换风格。想换主题?先dwall -h,它会把所有可用风格列出来——aurora、beach、bitday、firewatch、mojave、tokyo 等二十多套。找到心仪的名字,改一行 cron 任务里的风格名即可,无需重装。
让终端配色跟着壁纸走。如果安装了 pywal,可以用-p参数让桌面配色方案随壁纸联动:
dwall -p -s sahara终端、polybar、rofi 等支持 pywal 的应用会自动切换到与当前壁纸匹配的色板,视觉上会非常统一。
塞进你自己的壁纸包。官方壁纸看腻了也没关系,dwall 支持自定义主题。规则很简单:把图片命名为0.jpg(或.png)到23.jpg,放到/usr/share/dynamic-wallpaper/images/你的风格名/目录下即可。图片不够 24 张也没关系,可以用符号链接凑数,缺图的位置会自动跳过。
sudo mkdir -p /usr/share/dynamic-wallpaper/images/my-style sudo cp ~/下载/我的壁纸/*.jpg /usr/share/dynamic-wallpaper/images/my-style/ # 把文件重命名为 0.jpg ~ 23.jpg 后即可使用 dwall -s my-style开机自动恢复壁纸。登录系统后壁纸不会自己回来?把dwall -s 风格名 &写进~/.bashrc,或者加一条@reboot的 cron 任务,开机时就会自动设定当前时段该有的壁纸。
异常自查清单:一张表排查大部分故障
遇到问题先别慌,也别急着卸载重装。把下面这张表当"体检单"过一遍,八成的情况一分钟内就能定位:
| 你看到的现象 | 最可能的原因 | 值得一试的检查 |
|---|---|---|
| 壁纸一直不换 | cron 任务没配上或服务未运行 | crontab -l看任务在不在;systemctl status cron看服务活没活 |
| 手动执行正常、定时任务没反应 | cron 环境缺 DISPLAY 等变量 | 给 cron 行加上env DISPLAY=:0 ...前缀 |
| 报错 Invalid style name | 风格名拼错或目录不存在 | dwall -h对照可用列表;ls /usr/share/dynamic-wallpaper/images |
| 报错找不到 feh / crontab | 依赖未安装 | 按文中命令安装feh、cron、xrandr |
| Wayland 会话下不生效 | oguri 守护进程没启动 | 安装并运行ogurictl start;sway 用户先pkill swaybg |
| XFCE 下换壁纸没反应 | 显示器编号与脚本默认值不一致 | 用xfconf-query -c xfce4-desktop -m观察实际 screen/monitor 编号 |
其中最容易迷惑人的是"手动正常、定时失败"这一条:请记住,cron 不等于你的终端,它没有你登录会话里的环境信息,所有相关变量都得在命令里显式声明。遇到多显示器或远程登录的情况,DISPLAY的值可能不是:0,用echo $DISPLAY确认后再改。
写在最后:让壁纸自己会过日子
从最初那个"清晨壁纸纹丝不动"的小事故,到装好工具、配好 cron、甚至换上自己的壁纸包,你其实已经摸清了这类"定时任务驱动"型工具的全套玩法:工具本身往往很简单,真正的门槛在于让定时任务继承你桌面会话的环境。理解了这一层,往后无论遇到什么类似脚本,你都能举一反三。
dynamic-wallpaper 的核心逻辑都在dwall.sh这一个文件里,想看实现细节可以直接翻源码;想深入了解某个风格的来源,每个主题目录里通常也有 README 标注图片来源。如果排查一圈仍然无解,带着echo $DESKTOP_SESSION和echo $XDG_SESSION_TYPE的输出去项目里提交 issue,维护者和社区会帮你一起看——毕竟,让桌面在每个整点都换一副面孔,这份浪漫值得被认真对待。
【免费下载链接】dynamic-wallpaperA simple bash script to set wallpapers according to current time, using cron job scheduler.项目地址: https://gitcode.com/gh_mirrors/dy/dynamic-wallpaper
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考