当多个 systemd 单元停止时关闭系统

当多个 systemd 单元停止时关闭系统

当特定的 systemd 单元列表停止时,我试图关闭计算机。

背景是我在 Google 云和 AWS EC2 中有一个计算场,每个实例都会启动几个服务,这些服务执行大量工作,然后在完成后退出。由于这些是云实例并且需要花钱,因此一旦不再执行任何操作,实例就应该关闭。

我见过的大多数建议都涉及放置一个ExecStopPost=/sbin/init 0在 systemd 单元文件中放置一个(或类似的)。但是我无法关闭实例,直到全部这些单位已经完成。对我来说,创建一个包含各个工作单元的单元很容易target,然后将 a 放入StopWhenUnneeded=true其中,以便一旦所有工作单元停止,目标就会停止。但我没有看到使用它来触发系统关闭的方法(例如通过调用systemd-halt.service)。

所以问题是:一旦单元列表或我的目标单元停止,如何让系统关闭。

答案1

经过一些实验,我提出的一个可行的、不完全丑陋的解决方案是使用包装器target单元的想法,但使用一个service在退出时关闭系统的方法。

例如,工人服务:

# [email protected]
[Unit]
BindsTo=master.service
After=master.service

[Service]
ExecStart=/bin/myworker

[Install]
WantedBy=master.service

然后对于包装器:

# master.service
[Unit]
StopWhenUnneeded=true

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/sbin/init 0

然后我可以systemctl start master.service启动所有工作人员(在systemctl enable处理它们之后),当它们全部退出时,master.service将停止并执行init 0.
systemctl stop master.service还将向工作单元发出停止信号,但会在执行 之前等待它们init 0

丑陋之处在于必须创建一个执行的虚假服务/bin/true。如果有一个现有的 systemd 单元,当停止时会导致系统关闭,那就更好了,但这至少是功能性的。

相关内容