特定のシステムデバイスのリストが停止したら、コンピュータをシャットダウンしようとします。
背景は、Google CloudとAWS EC2にコンピューティングファームがあり、各インスタンスが多数のタスクを実行し、完了すると終了する複数のサービスを開始することです。これはクラウドインスタンスであり、費用がかかるため、これ以上作業を行わない場合は、インスタンスを終了する必要があります。
私が見たほとんどの提案は、ExecStopPost=/sbin/init 0
システム単位ファイル(または同様のもの)に配置することに関連しています。ただし、インスタンスを閉じることはできません。みんなこのユニットは完了しました。個々の作業単位を含むセルを作成し、target
すべて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
。停止時にシステムをシャットダウンする既存のシステムデバイスがあれば、より良いですが、少なくとも機能することはできます。