![帮助创建 Systemd 定时器来自动更改窗口主题](https://linux22.com/image/924718/%E5%B8%AE%E5%8A%A9%E5%88%9B%E5%BB%BA%20Systemd%20%E5%AE%9A%E6%97%B6%E5%99%A8%E6%9D%A5%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%94%B9%E7%AA%97%E5%8F%A3%E4%B8%BB%E9%A2%98.png)
我正在尝试让 Ubuntu 20.04 LTS(“Focal Fossa”)每天早上 0600(上午 6 点)自动切换到“浅色”窗口主题,并在每天晚上 1800(下午 6 点)自动切换到“深色”窗口主题。
以下终端命令可用于更改为“浅色”窗口主题:
gsettings set org.gnome.desktop.interface gtk-theme Yaru-light
以下终端命令可用于更改为“深色”窗口主题:
gsettings set org.gnome.desktop.interface gtk-theme Yaru-dark
但如上所述,我想自动化这个流程。
我得到的第一个建议是通过 cron 作业,然而这反复被证明是不成功的,所以另一个用户建议了一种更“现代”的方法,通过 Systemd“计时器”...不幸的是,我不熟悉 Systemd 和创建计时器的过程,所以我一直在学习,但迄今为止还没有成功。
此时,我的“home”文件夹中有六个文件:
- 黑暗服务
- 暗黑计时器
- 暗黑
- 轻量服务
- 灯光计时器
- 光文件
“dark.service”的内容为:
[Unit]
Description=Automatically change the "Window Theme" to "dark" in the evening.
[Service]
ExecStart=/home/gregory/dark.sh
[Install]
WantedBy=dark.sh
dark.timer的内容为:
[Unit]
Description=Automatically change the "Window Theme" to "dark" in the evening.
[Timer]
OnCalendar=*-*-* 18:00:00
Persistent=true
[Install]
WantedBy=dark.service
“dark.sh”的内容为:
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
gsettings set org.gnome.desktop.interface gtk-theme Yaru-dark
“light.service”的内容为:
[Unit]
Description=Automatically change the "Window Theme" to "light" in the morning.
[Service]
ExecStart=/home/gregory/light.sh
[Install]
WantedBy=light.sh
“light.timer”的内容为:
[Unit]
Description=Automatically change the "Window Theme" to "light" in the morning.
[Timer]
OnCalendar=*-*-* 06:00:00
Persistent=true
[Install]
WantedBy=light.service
“light.sh”的内容为:
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
gsettings set org.gnome.desktop.interface gtk-theme Yaru-light
我使用“启动应用程序偏好设置”(gnome-session-properties
)在登录时运行“light.timer”和“dark.timer”。
根据我在其他地方得到的建议和我在网上读到的内容,我认为通过 Systemd 创建“计时器”是可能是正确的方法来实现我想要的(根据一天中的时间自动切换“亮”和“暗”窗口主题)...我只需要一点帮助就可以让事情正常运作,因为 Systemd、计时器和脚本对我来说是一个全新的世界。
答案1
WantedBy=default.service
(对的后期编辑WantedBy=default.target
)
这可能是一个漫长的旅程,但这里有一些指示。所有WantedBy
条目都是错误的。它们不能依赖于 shell 脚本。计时器单元x.timer
始终与服务单元相关联x.service
。如果您使用start
计时器,它们将在给定时间启动其服务。但您需要在每次登录时都这样做。因此,您需要启用计时器,并让 systemd 自动启动它们。要做到这一点,您需要让计时器有WantedBy=
一个在用户登录时实现的目标。通常,这是default.target
。虽然有很多系统目标,但用户目标却很少。
由于您的脚本非常短,您可能希望将它们包含在服务单元中,以保持较小的体积。服务和计时器文件必须位于 ~/config/systemd/user/ 中。如果不存在此目录,则需要创建它。例如:dark.service:
[Unit]
Description=Automatically change the "Window Theme" to "dark" in the evening.
[Service]
Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
ExecStart=/usr/bin/gsettings set org.gnome.desktop.interface gtk-theme Yaru-dark
暗.计时器:
[Unit]
Description=Automatically change the "Window Theme" to "dark" in the evening.
[Timer]
OnCalendar=*-*-* 18:00:00
Persistent=true
[Install]
WantedBy=default.target
轻量服务:
[Unit]
Description=Automatically change the "Window Theme" to "light" in the morning.
[Service]
Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
ExecStart=/usr/bin/gsettings set org.gnome.desktop.interface gtk-theme Yaru-light
灯光.定时器:
[Unit]
Description=Automatically change the "Window Theme" to "light" in the morning.
[Timer]
OnCalendar=*-*-* 06:00:00
Persistent=true
[Install]
WantedBy=default.target
每当您更改这些文件的内容,或者从此目录添加或删除文件时,您都需要通过以下命令通知 systemd:
systemctl --user daemon-reload
我不确定 gnome 的“启动应用程序首选项”是做什么的。systemd 开始使用这些单元的方法是只执行一次,而不是以 root 身份执行:
systemctl --user enable dark.timer light.timer
现在,无论何时您登录,这些单元都会启动,并在您注销时停止。
在开发单元时,您可能希望立即测试它们,而无需登录/注销。您可以使用以下方式显式启动它们:
systemctl --user start dark.timer light.timer
你可以用以下方法阻止它们
systemctl --user stop dark.timer light.timer
您需要先停止它们,然后才能重新启动它们。您可以将停止和启动组合在一起
systemctl --user restart dark.timer light.timer
您可以使用以下方式检查他们的状态
systemctl --user list-timers
它应该说明它们下次何时触发以及它们将运行什么服务。
如果有关于 systemd 的教程就好了用户单位,但我没有找到合适的。他们大多谈论系统单位。你可以从这个大红帽文档,但是它是为管理员准备的,因此有点太详细了,但它有助于理解其中一些内容对于用户单位来说是共同的。