systemctl を使用すると、開始または停止コマンドに複数のサービス名を渡すことができます。
systemd では、サービス A がサービス B の前に停止するように構成されていると仮定します。今実行すると
systemctl stop B A
では、A とすべての依存サービスが最初に停止し、B または B が最初に systemctl コマンドに渡されますか?私は、systemctl stopのサービス名の順序がサービスが停止する順序を定義しないことです。
私はテストを実行し、彼らは私の仮説を証明しました。しかし、私はこれが常にうまくいくと100%確信したいと思います。
答え1
まさか!現在のコードはあまりスマートではなく、すべてのサービスを停止/開始しようとします。
[与えられた順序で処理します。これは小さいそれでもとてもスマートです。何らかの理由で(おそらくパフォーマンス上の理由で)、各項目の後に待たずに最後だけ待つことになります。だからそれはうまくいきませんsystemctl start A; systemctl start B
。もっと近いですsystemctl start A & systemctl start B & wait
。 ]
したがって、ユニットファイルが次のような場合 -
# A.service
[Unit]
After=B.service
[Service]
Type=oneshot
ExecStart=/bin/sleep 2
# B.service
[Service]
Type=oneshot
ExecStart=/bin/sleep 2
systemctl start A B
AとBが始まります。現在のコードはいいえAを始める前に、Bが完全に始まるまで待つ必要があります。 [現在のAとBは並列に始まります。 ]できますjournalctl
Mar 20 20:50:29 alan-laptop systemd[2007]: Starting A.service...
Mar 20 20:50:29 alan-laptop systemd[2007]: Starting B.service...
Mar 20 20:50:31 alan-laptop systemd[2007]: Started A.service.
Mar 20 20:50:31 alan-laptop systemd[2007]: Started B.service.
ただし、AとBが開始時に初期トランザクションに含まれると、期待どおりに注文されます。
私はいくつかの異なるデバイスで使用できるsystemd-run
一時的なサービスを作成して実行するために何かをすることが可能だと思いました。すべての依存関係は一緒に処理されます。その後、デバイスAに順序依存関係がある場合、またはデバイスBへの順序依存関係がある場合、その順序依存関係は尊重されます。Requires
Wants
Conflicts
Before=
After=
答え2
はい、あなたの家は正しいです。
単一のコマンドで複数のデバイスを起動または停止した場合、systemctl
そのコマンドは取引したがって、システム管理者デーモン(PID 1とも呼ばれます)は両方とも起動しようとします。
順序依存関係が存在する場合(以下を使用して構成Before=
またはAfter=
ディレクティブで構成されている場合)、その依存関係が考慮されます。
したがって、デバイスBの後にデバイスAを起動するように順序を設定すると(ファイルにA.service
表示されますAfter=B.service
)、これはデバイスAが停止することを意味します。今後デバイスB(デバイスを停止するときの順序は逆)を使用すると、説明したように実行されます。 Aに依存するデバイスが最初に停止し(Aが停止しても実行できないため)、Aは最後にBを停止します。以下に。
デバイス間に逐次依存関係がない場合、デバイスは起動または停止します。平行に。 (これが意味するもの:systemdは順番に処理しますが、SIGTERM信号でプロセスを終了するか、プロセスをフォークしてExecStop=
デバイスのコマンドを実行しますが、ちょっと待ってマスターPIDを終了するか、ExecStop=
コマンドを完了するには:「パラレル」この文脈では意味があります。信号は非同期であり、フォークは非遮断であるため、これは真の並列性に非常に近いとほぼすべての効果が同じであると考えることができます。 )
ほとんどの場合、渡される単位の順序はsystemctl
重要ではありません。 (非常に極端な場合にのみ同じように動作します。)明示的な順序依存関係がある場合は尊重されます。それ以外の場合、サービスは並列に開始/停止されます。
簡単に言えば、systemctl stop B A
本質的にsystemctl stop A B
同じです。