帮助创建 Systemd 定时器来自动更改窗口主题

帮助创建 Systemd 定时器来自动更改窗口主题

我正在尝试让 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 的教程就好了用户单位,但我没有找到合适的。他们大多谈论系统单位。你可以从这个大红帽文档,但是它是为管理员准备的,因此有点太详细了,但它有助于理解其中一些内容对于用户单位来说是共同的。

相关内容