如果进程尚未完成,systemd计时器单元是否跳过下一次运行?


18

我想使用systemd每5分钟运行一次命令。但是,存在执行任务有时可能需要5分钟以上的风险。到那时,systemd将启动命令的第二个实例,即我最终将运行2个进程吗?

如果第一个尚未完成,是否可以告诉systemd不要启动第二个进程?如果没有,有什么好的解决方法?

注意:我希望答案是“这是默认行为。只是没有记录在案。” 如果是这种情况,有人可以告诉我如何针对他们的文档提交错误吗?

注意:Cron有一个类似的问题,将在/unix//a/173928/11244中讨论。我正在寻找systemd等效项。

Answers:


27

这是默认的(也是唯一的)行为。它没有明确记录,但是由systemd的操作逻辑暗示。

systemd.timer(5)读取:

对于每个计时器文件,必须存在一个匹配的单位文件,其中描述了计时器经过时要激活的单位。

systemd(1)依次描述了单元状态及其之间的转换的概念:

单元可以是“活动的”(表示已启动,绑定,插入...,具体取决于单元类型,请参阅下文),也可以是“非活动的”(表示已停止,未绑定,未插入...),以及在被激活或取消激活的过程,即在两个状态之间(这些状态称为“激活”,“去激活”)。

这意味着计时器的触发导致匹配单元的“激活”,即转换为“活动”状态。

如果匹配单元在“激活”时已经处于“活动”状态(对于服务单元,这意味着“主进程仍在运行”,除非服务单元具有Type=oneshotRemainAfterExit=true),否则显然不会采取任何措施。采取。


您能否阐明“ oneshot”服务?在我看来,“ oneshot”服务在任何情况下都不应运行其他副本(联机帮助:进程必须在systemd启动后续单元之前退出)
Gima

1
@Gima一个没有任何附加参数的oneshot单元在其初始进程运行时被视为“正在激活”,退出时将变为“非活动”。此时,另一个触发器可以再次激活该单元。
intelfx

1
@Gima ...但是,一个oneshot单元RemainAfterExit=true在其初始过程退出时将保持“活动”状态,因此,除非管理员明确停用(停止)该单元,否则将忽略计时器的后续触发,否则它将被否定依赖性。
intelfx

1
人们不断邀请我时,我不断获得代表。我希望systemd不会澄清他们的文档。
TomOnTime

1
现在,这已成为systemd文档的一部分Note that in case the unit to activate is already active at the time the timer elapses it is not restarted, but simply left running. There is no concept of spawning new service instances in this case. -freedesktop.org/software/systemd/man/systemd.timer.html
Sam Sam
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.