reboot
Linuxでは、シェルでコマンドを実行すると、シェルbash
(たとえば)を切断する一連のイベントは何ですか?
次のいずれかであるようですが、どちらかはわかりません。
- 再起動信号を送信する前に、シェルからログアウトされます。
- 再起動信号を送信した後、シェルが私をログアウトします。
- 再起動信号を送信し、ログアウトプロセスを実行せずにシェルが突然終了します。
ベストアンサー1
この動作は、展開/シェル/構成によって異なります。私のシステム(Gentoo / SysVinit)で再起動を実行すると、次のようになります(おそらくシナリオ3):
再起動コマンド委任終了(からman reboot
):
システムが実行レベル0または6でない場合(つまり、システムが正常に稼働しているとき)、停止または再起動が呼び出されると、シャットダウンが呼び出されます(-hまたは-rフラグを使用)。詳細は shutdown(8) マンページを参照してください。
すべてのプロセス(シェルを含む)はSIGTERMを受信してクリーンアップするのに3秒かかります(からman shutdown
)。
すべてのプロセスは最初にSIGTERM信号を受信し、システムがまもなく終了することを通知します。これは、vi(1) などのプログラムが編集中のファイルを保存する時間を提供し、メールやニュース処理プログラムを完全に終了する機会を提供します。
-t secは、init(8)に他の実行レベルに変更する前に、すべてのプロセスに警告(SIGTERM)と終了信号(SIGKILL)を送信するまでの間待機するように指示します。値を指定しない場合、2つの信号間のデフォルト時間は3秒です。警告:shutdownがinitを呼び出してシャットダウン(デフォルト動作)を実行すると、initはすべてのプロセスが終了したことを確認し、子プロセスがすべて終了すると早く待機を停止します。 -nフラグでshutdownを呼び出すと、他のすべてのプロセスが終了しても、指定された合計時間(または3秒)待ちます。
Bashは実際にSIGTERM(from man bash
)を無視します。
bashが対話型の場合、トラップなしでSIGTERMを無視します(したがって、Kill 0は対話型シェルを終了しません)。
したがって、init
ランレベルを変更し(おそらく)別のSIGTERMを送信してからSIGKILLを送信します(からman init
)。
init がランレベルを変更する要求を受信すると、新しいランレベルで定義されていないすべてのプロセスに警告信号 SIGTERM を送信します。その後、3秒待ってからSIGKILL信号を介してこれらのプロセスを強制終了します。
長すぎると、bashが正常に終了せずに終了し、他のプログラムも終了する可能性がありますが、特定の動作には依存しません。