如何使由关联计时器触发的 systemd 服务在系统重启后也执行?

如何使由关联计时器触发的 systemd 服务在系统重启后也执行?

我有一个与计时器关联的工作 systemd 服务,它们共享相同的文件名词干——服务单元文件名以 结尾.service,关联的计时器单元文件名以 结尾.timer。计时器旨在在服务上次处于非活动状态后的某个时间(60 秒)启动服务。这在计时器文件中指示:

[Timer]
OnUnitInactiveSec=60

[Install]
WantedBy=multi-user.target

服务按预期触发,一切正常,除了一个“小”问题——计时器只指定服务应在最后一次处于非活动状态(大概是在完成后)60 秒后启动,这并不意味着在新[重新]启动系统等条件下触发

我还希望该服务在系统重新启动时首先运行,这可能由于某些管理更新或我们组织未执行的操作而时常发生,从而影响系统的持续正常运行时间。

是否可以在系统启动时让服务运行一次?我确信在首次执行后,计时器应该会按预期工作,因为它会在首次执行 60 秒后再次触发执行,依此类推。

我的服务单元文件如下(我删除了Description和的更敏感的值Service,并用“占位符”替换它们):

[Unit]
Description=Foobar service

[Service]
ExecStart=/path/to/foobar

我该怎么做才能补充我想要的额外条件——在启动时运行一次,以便每次重新启动时我都不必关注系统?

该服务在设计上是计时器调用的——因此没有Install部分等。它本质上是一个处理一组与谓词匹配的文件的程序。不确定没有部分是否Install是个问题,但我猜没有部分应该可以很好地适应它是由计时器触发的,并且脚本本质上是“单次扫描”。

答案1

该服务是设计为计时器调用的 - 因此没有Install部分等。

但现在你希望它被计时器调用在启动时启动,因此原始设计不再适用。因此,[Install]向服务添加一个部分,systemctl enable以便它通过 multi-user.target 运行(除了仍然由计时器调用)。

(您也可以直接将依赖项符号链接添加到 multi-user.target.wants/,而不使用此部分或 systemctl,但这会使链接更容易被意外删除。)

或者,扩展定时器以添加OnBootSec=1s(或类似)当前功能。单个定时器中允许多个“开启”设置,并且每当任何这些超时已经过去。

(有三种不同的“启动时”选项;由于服务依赖性,它们都应该可以工作,但总体而言,OnBootSec= 可能是最合适的。)

或者,创建第二个单独的计时器,通过 OnBootSec= 触发相同的服务。计时器单元可以有不同的名称,只要它们用于Unit=指定要调用的内容即可。

3 个选项中的任何一个都应该同样有效。对于计时器来说,该单元是否也作为某个目标的依赖项安装并不重要。

相关内容