当特定的 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 单元,当停止时会导致系统关闭,那就更好了,但这至少是功能性的。