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

Tom*_*ime 36 cron systemd

我想使用 systemd 每 5 分钟运行一次命令。但是,有时任务运行时间可能会超过 5 分钟,这是存在风险的。那时,systemd 会启动命令的第二个实例,即我最终会运行 2 个进程吗?

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

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

注意:Cron 有一个类似的问题,在https://unix.stackexchange.com/a/173928/11244 中讨论过。我正在寻找 systemd 等价物。

int*_*lfx 44

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

systemd.timer(5)读取:

对于每个计时器文件,必须存在匹配的单元文件,描述在计时器结束时要激活的单元。

systemd(1)反过来描述了单元状态的概念以及它们之间的转换:

单元可能是“活动的”(意思是启动、绑定、插入……,取决于单元类型,见下文)或“非活动”(意思是停止、未绑定、未插入……),以及在被激活或去激活的过程,即在两种状态之间(这些状态被称为“激活”、“去激活”)。

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

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

  • 这现在是 systemd 文档的一部分 - `请注意,如果要激活的单元在计时器结束时已经处于活动状态,则不会重新启动,而只是保持运行。在这种情况下没有产生新服务实例的概念。` https://www.freedesktop.org/software/systemd/man/systemd.timer.html (4认同)
  • @Gima 没有任何额外参数的 oneshot 单元在其初始进程运行时被视为“激活”,并在退出时变为“非活动”。此时,另一个触发器可以再次激活该单位。 (3认同)
  • @Gima ...但是,一个具有 `RemainAfterExit=true` 的 oneshot 单元在其初始进程退出时将保持“活动”状态,因此除非管理员明确停用(停止)该单元,否则定时器的后续触发器将被忽略,或者它被负依赖带来了。 (3认同)
  • @TomOnTime 这是你提出明显相关问题的奖励,所以只要享受代表不断加入的乐趣即可;) (3认同)
  • 当人们邀请这个时,我不断得到代表。我希望 systemd 不会澄清他们的文档。 (2认同)