Gilles は、Linux カーネルがどのように終了するかについての優れた答えを次の場所に書きました。https://unix.stackexchange.com/a/122667/674
Linuxオペレーティングシステム(systemvinitとsystemdの場合)を終了する方法を知りたいです。 Linux OSと同様の起動順序を期待しています。具体的には、SIGTERMやSIGKILLなどの信号や他のプロセス間通信手段を介してプロセスがどのように通知されるのか疑問に思います。
ありがとうございます。
関連:
「オペレーティングシステムの終了時」と「カーネルの終了時」の違いは何ですか?
オペレーティングシステムがシャットダウンしたら、サービス管理者はSIGTERMとSIGKILLをそのサービスに送信する必要があることをどのように知ることができますか?
答え1
systemdsysvinit
とsystemdの場合、オペレーティングシステムをシャットダウンすると、まずinit
システムをシャットダウンする必要がある(または再起動または電源を切る必要がある)プロセス(pid 1のプロセス)に通知されます。
sysvinit
/run/initctl
これは、FIFOを使用して通信し、init
適切な実行レベルに切り替えるように要求することによって行われます。バラよりinit
マンページ簡単な概要を教えてください。
systemdはこれを行うためのいくつかの方法をサポートしています。様々な種類シグナルさまざまな方法で終了、再起動などを要求するために使用できます。また、d-bus(busctl
マンページこれを調べる方法を説明します)。
pid 1が終了するように要求されたら、その設定と仕様に従い、すべての適切な手順を実行します。これは通常、シャットダウンが発生していることをすべてのユーザーに通知し、実行中のすべてのサービスをシャットダウンし(systemdを使用して管理し、さまざまな形式のシャットダウンスクリプトを使用)、マウントされたsysvinit
ファイルシステムを同期し、アンマウントできます。 、残りのプロセスを終了する(通常の順序を使用)タスクが含まれます。 )、最後に適切なパラメータを使用してカーネルのシステムコールをTERM
呼び出します。KILL
reboot
これは一般的な順序を説明します。アクセス制御(Polkitを使用)、利用可能なさまざまなフック、kexec
突然の停電処理、処理など、これらすべてにはより多くの紆余曲折があります。CtrlAltDelシステム文書では、これらの詳細を多く扱っています。