暂时覆盖两个互补定时器之一

暂时覆盖两个互补定时器之一

为了切换浅色和深色配色方案,我设置了两个单元,它们运行一个脚本,当由各自的计时器触发时,该脚本创建指向我的白蚁配置文件的符号链接。链接的文件包含适当的浅色或深色方案,然后当白蚁收到 时SIGUSR1,它会重新加载其配置。都好。

$ systemctl --user list-timers
NEXT                         LEFT          LAST                         PASSED  UNIT             ACTIVATES
Mon 2018-11-05 14:20:00 CET  9min left     Mon 2018-11-05 14:10:13 CET  1ms ago brightside.timer brightside.service
Mon 2018-11-05 16:00:00 CET  1h 49min left n/a                          n/a     darkside.timer   darkside.service

$ cat ~/.config/systemd/user/brightside.timer
[Unit]
Description=Ensure a bright colorscheme every ten minutes during the day.

[Timer]
OnCalendar=*-*-* 09..15:0/10

[Install]
WantedBy=timers.target

因此白天每 10 分钟brightside.service链接termite_light.conf一次。${XDG_CONFIG_HOME}/termite/config然后,darkside.timer接管:

[Timer]
OnCalendar=*-*-* 16..23:0/10
OnCalendar=*-*-* 00..08:0/10

现在我想通过~/.config/systemd/user/{dark,bright}side.d/override.conf使用 shell 脚本创建或删除符号链接来覆盖其中一个或两个计时器。最终我想要一个可编程的定时器设置,就像在电源插座定时器上一样。 (但具有改变季节性白天长度的优点)。这里的想法是提供一个四向切换:

  • 明亮【说明书】
  • 明亮[自动]
  • 深色【手动】
  • 深色[自动]

如果我dark [automatic]在白天设置模式,脚本首先设置黑暗方案。然后它应该暂时覆盖brightside.timer或停止计时器,这样我们就不会立即切换回来。但我该如何做到这一点,以便在时间darkside.timer结束时brightside.d/override.conf被删除,或者 Brightside.timer 再次启动?

我之前使用AssertPathExists/tmp 中的空文件来覆盖计时器。也许这仍然是最好的解决方案,因为我可能会重新加载守护进程以合并 override.conf,不是吗?

答案1

我想一个选择是再引入两个计时器(和服务),它们每天仅在切换时间(上午 9 点和下午 4 点)触发一次,并让这些服务删除任何覆盖并根据需要重新启用计时器以删除手动设置并返回到自动状态。

但我真的认为你在某种程度上对此进行了过度设计......虽然值得称赞的是你在没有单个 shell 脚本的情况下成功实现了这一切,并且你充分利用了 systemd 功能,例如非常灵活的日历计时器单位的规格和覆盖文件的便利性,我认为在 systemd 中编码系统状态(暗与亮,手动与自动)并不能真正简化您的整体解决方案。

作为练习,尝试想象一下您的组合是否更大。例如,如果您每天不仅有两种配色方案,而是三种配色方案怎么办?或者,如果您有四种不同的“明亮”配色方案,每个季节一种?或者,如果您想根据日出/日落时间调整开关时间?

在我看来,使用单个 systemd 计时器 + 服务来切换颜色方案会更合适,让该服务调用一个脚本(shell、python 等)来选择颜色方案,考虑到当前时间,但也管理现有的覆盖(也许在 /run 中使用状态文件。)

这样的系统总体上会比单独使用 systemd 单元构建的更简单,并且更具可扩展性。

相关内容