如何使 systemd 服务原子化;手动锁定/pid 文件或 systemd 功能是否存在?

如何使 systemd 服务原子化;手动锁定/pid 文件或 systemd 功能是否存在?

我有mybackups.servicemybackups.timer。我希望mybackups.service只有一个正在运行的实例。也就是说,我希望发生以下情况:

情况 1:定时器已启动mybackups.service

如果我出于某种原因手动运行备份,$ systemctl start mybackups.service我希望 systemctl 说“跳过,已在运行”

情况 2:我手动启动了mybackups.service

mybackups.timer尝试按计划启动其服务时,我希望它被 systemd 停止,并记录一些错误,例如:mybackups.service was already in progress

案例 3:长时间运行的服务

显然,我希望修复这种破坏,但如果由于某种原因mybackups.service运行时间太长,我希望下一次启动mybackups.timer将得到与案例 #2 相同的处理(即:我希望它不会启动*另一项*服务运行)

总结可以 (和我有mybackups.service改变启动时的底层程序出口当它在某处找到一个旧的 PID 文件和一个仍然有效的 PID 时。然而,这是一个我预料到的普遍问题[2] &希望 systemd 有选项为了这。

[2]:例如:systemd 已经跟踪了其服务的整个 PID 树,它似乎是可以为您正确完成此操作的完美选择。

答案1

从:https://www.freedesktop.org/software/systemd/man/systemd.timer.html

请注意,如果要激活的单元在计时器到时已经处于活动状态,则不会重新启动,而只是保持运行。在这种情况下,没有产生新服务实例的概念。

答案2

这已经是默认行为。同一个单元最多只有一个实例,并且 systemd 会默默地拒绝将启动作业排队给已经启动或处于活动状态的单元。


(事实上​​,为了实现对面的您需要模板单元,例如,[email protected]可以使用不同的参数启动多次。但是,每个这样的单元仍然是唯一的;例如,systemd 不会启动两个副本[email protected]。)

相关内容