シャットダウンコマンドが発行された後、次のようなステータスメッセージが表示されることがあります。
A stop job is running for Session 1 of user xy
その後、システムはしばらくの間、または???
に応じて永久にハングします。では、「ストップジョブ」とは正確には何ですか?
また、なぜそれがかかる時間を非常に正確に見積もるのか、それ以外の場合は永久に実行できるのですか?
承認された回答:
systemdは、「ジョブ」のキューの観点から内部的に動作します。各ジョブ (少し簡略化)は、実行するアクションです。特定のユニットを停止、確認、開始、または再起動します。 。
たとえば、systemdにサービスユニットを開始するように指示した場合 、それは、ユニットの要件と依存関係に従って、その目標を達成するために必要なユニット(サービスユニット、マウントユニット、デバイスユニットなど)の停止および開始ジョブのリストを作成し、ユニットの順序関係に従ってそれらを順序付けます、解決し、(可能であれば)自己矛盾を修正し、(その最終ステップが成功した場合)それらをキューに入れます。
次に、キューに入れられた「ジョブ」を実行しようとします。
ユーザーxyのセッション1で停止ジョブが実行されています
ユニット表示名 これがSession 1 of user xy
です 。これは(表示名から)セッションになります サービスではなくユニット 単位。これは、systemdのlogind
によって維持されるユーザースペースのログインセッションの抽象化です。 プログラムとそのPAMプラグイン。これは、(本質的に、理論的には)そのユーザーがどこかで「ログインセッション」として実行しているすべてのプロセスのグループです。
それに対してキューに入れられたジョブはstop
です 。そして、systemdの人々が誤ってセッションを混乱させたため、おそらく長い時間がかかります hangup セッションシャットダウン 。彼らは前者を壊して後者を機能させ、それに応じて一部の人々はsystemdを変更して後者を壊して前者を機能させます。システム化された人々は、彼らが2つの異なるものであることを本当に認識する必要があります。
ログインセッションで、SIGTERM
を無視するものがあります または、SIGTERM
を確認すると、終了するまでに長い時間がかかります。 。皮肉なことに、前者は一部のジョブ制御シェルの長年の動作です。ログインセッションリーダーがこれらの特定のジョブ制御シェルである場合にそれらを終了する正しい方法は、セッションがハングアップしたことをリーダーに通知することです。 、するとすぐに、すべてのを終了します。 ジョブ(内部のsystemdジョブとは異なる種類のジョブ)を実行してから終了します。
実際に起こっているのは、systemdがユニットの停止タイムアウトを待機していることです。 SIGKILL
に頼るまで 。もちろん、このタイムアウトはユニットごとに構成可能であり、タイムアウトしないように設定できます。したがって、なぜ人は潜在的に異なる行動を見ることができるのか。
さらに読む
- レナートポッターリング(2015)。 systemd。 systemdのマニュアルページ。 Freedesktop.org。
- ジョナサンデボインポラード(2016-06-01)。 systemdは、ユーザーがログアウトした後、バックグラウンドプロセスを強制終了します 。 825394。Debianバグトラッカー。
- レナートポッターリング(2015)。 systemd.kill。 systemdのマニュアルページ。 Freedesktop.org。
- レナートポッターリング(2015)。 systemd.service。 systemdのマニュアルページ。 Freedesktop.org。
- bashがSIGTERMを無視するのはなぜですか?
- https://superuser.com/questions/1102242/