
シャットダウンコマンドを実行すると、次のステータスメッセージが表示されることがあります。
A stop job is running for Session 1 of user xy
その後、システムは???に応じてしばらくまたは永久に中断されます。
それでは、「封じ込め」とはまさに何ですか?
また、なぜかかる時間をかなり正確に予測する時もあり、永遠にかかる時もあるのでしょうか?
答え1
systemdは「ジョブ」キューで内部的に機能します。各働く(少し簡素化) 取るべきアクションは、特定のタスクを停止、確認、開始、または再開することです。単位。
(例えば)systemdにサービスユニットは、ユニット要件と依存関係に基づいて目標を達成するために必要なすべてのユニット(サービスユニット、設置ユニット、機器ユニットなど)の作業停止と開始リストを開発し、ユニット注文関係に基づいてソートすることで問題を解決します。 (可能であれば)不一致を修正し(最後のステップが成功した場合)、キューに入れます。
その後、待機中の「ジョブ」を実行しようとします。
ユーザーxyに対してセッション1で実行されているジョブを停止する
その単位名前を表示するこれはSession 1 of user xy
。 (表示名で判断すると)会議一つではないユニット提供する単位。これはlogind
、systemd プログラムとその PAM プラグインによって維持されるユーザー空間ログインセッションの抽象化です。これは、(本質的または理論的に)このユーザーのどこかで「ログインセッション」として実行されるすべてのプロセスをグループ化したものです。
待機中のジョブはですstop
。システムユーザーが誤ってセッションをマージしたため、時間がかかることがあります。壊すセッションを含める閉鎖。彼らは後者を操作するために前者を壊し、それに対応して、一部の人々は後者を壊すために前者を操作するためにシステムを変更します。体系化された人々は、これら2つが互いに異なるという事実に気づくべきです。
SIGTERM
ログインセッションで無視されるか、一度確認された後に終了するのに長い時間がかかる項目がありますSIGTERM
。皮肉なことに、前者はいくつかのタスク制御シェルの長い動作です。ログインセッションリーダーがこれらの特定のジョブ制御シェルである場合、これを終了する正しい方法は、セッションが終了したことを通知することです。こんにちはだから彼らはすべて終了しました彼らジョブ(内部システムジョブとは異なるタイプのジョブ)を実行した後、それ自体が終了します。
実際に起こるのは、systemdがデバイスのタイムアウト停止SIGKILL
もちろん、このタイムアウトはデバイスごとに設定でき、タイムアウトが発生しないように設定できます。これが人々が他の行動を見ることができる理由です。
追加読書
- レナート・ペトリング(2015)。 システム。システムのマニュアルページ。 freedesktop.org.
- ジョナサン・ド・ボーイン・ポラード(2016-06-01)。systemdは、ユーザーがログアウトした後にバックグラウンドプロセスを終了します。。 825394.Debianのバグトラッカー。
- レナート・ペトリング(2015)。 systemd.kill。システムのマニュアルページ。 freedesktop.org.
- レナート・ペトリング(2015)。 システムサービス。システムのマニュアルページ。 freedesktop.org.
- bashがSIGTERMを無視するのはなぜですか?
- https://superuser.com/questions/1102242/
答え2
これらのメッセージは、ジョブを開始および停止する初期化システムであるsystemdから来ます。ジョブはデーモンである可能性がありますが、ディスクのマウントとマウント解除、/ tmpの削除、起動時の画面の明るさの保存と復元などの小さなジョブである可能性があります。systemctl list-units
このアイデアを提供します。 Systemd は「単位」と「作業」を同じ意味で使用します。
ジョブが停止した場合(例)、systemctl stop ...
問題は失敗を宣言し、シグナルを使用してジョブ・プロセスを終了する前にジョブが完了するのを待つ時間ですSIGKILL
。SIGKILL
私たちは必ずしも必要でない限り、この方法を使用したくありません。なぜなら、プロセスがきちんと終了する機会を与えないからです。一部のプロセスでは失敗を宣言するのに数秒で十分ですが、データベースなどの他のプロセスでは、ジョブを完全に停止するにはかなりのネットワークとディスクI / Oが必要になる可能性があるため、このユニットには数分かかることがあります。きちんと終了します。
systemctl stop $UNIT_NAME
終了時に表示される内容は、実行に時間がかかるものと同じです。 SIGKILLを発行し、それに関係なく終了を続行する前に経過した秒数と最大待機時間を示すカウンターがあります。
長い遅延が予想される妥当な理由がない限り、これは一般にある種の欠陥を表します。これには、DHCPサーバーがリリースに応答しないため、リリース操作がタイムアウトする必要があるか、デーモンが終了しないようにするいくつかのエラーが含まれる場合があります。
答え3
一部のサービスが中断され、systemdはそのサービスが終了するのを待っています。 Systemd は所要時間を正確に予測できない場合があります。時間(通常90秒)は、systemdが忍耐を失う前に待つ時間です。この記事を参照してください。
答え4
「停止したジョブ」とは、特定の「ジョブ」が停止するのをsystemd
待っていることを意味します(たとえば、続行する前に完了するのを待ついくつかのプロセス)。 「ジョブの実行を中止...」などの警告メッセージが表示された場合は、技術的にジョブキューに処理待ちのエントリがあることを意味します。
ただし、システム全体の作業キューを詳しく調べる前に、これらの警告メッセージは次のような間接的な結果である可能性があることに注意してください。環境要因(実際には、このメッセージはGitHubリポジトリの潜在的なバグとして引用されることもあります。)
例:「ジョブが停止しました」に関連するメッセージを受け取りましたが、理由がわかりませんでした。
サーバーを大きなディスクにアップグレードして再起動します。修理する;)