我有一个与计时器关联的工作 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 个选项中的任何一个都应该同样有效。对于计时器来说,该单元是否也作为某个目标的依赖项安装并不重要。