
Linuxでコマンドを実行した後、システムの再起動を妨げる原因をどのように追跡できますかsudo reboot
?
私はいつもこれでランレベルの切り替えが発生し、最終的に再起動すると思っていましたが、何度も再起動するように指示された後でもマシンが再起動されなかったため、今は困惑しています。
答え1
システムが中断することなくプロセスを実行したときに、この問題が発生したことがあります。 Apacheプロセスがディスク上で何かを待っているように見える非常に悪い状況があります。殺されない。
私が知っている限り、LinuxはシステムをシャットダウンするとSIGTERM
プロセスにsを送信し、SIGKILL
数秒後にあえて不従順にしたい人にsを送信します。ただし、これらのプロセスが中断できない状態の場合、カーネル自体はそれを保護します。これは、保留中のシステムコールにI / O操作が含まれているときにデータが失われることを防ぐのに役立ちます。今私は本当にできる他のことを思い出さない捨てる* aSIGKILL
なので、答えの他の要素をここにインポートできます。
*これはやや単純化された(間違っていませんが)見る方法であり、信号の非同期性を考慮しません。この点の詳細については、Gilesのコメントを参照してください。
しかし、中断のないプロセスの場合...
再起動せずに中断できないプロセスを終了するには:どのようにシステムコールを終了します。通常、電源スイッチを押さずにこれを行う最も効率的な方法は、電源コードを引くことです。カーネルハッカーになり、ドライバにTASK_KILLABLEを使用させることもできます。LWN 記事。
次のコマンドを使用して、中断することなく実行中のすべてのプロセスのリストを取得できます。
$ ps -eo 'state,pid,args' | awk '$1 == "D" {print;}'
$ ps -eo 'state,pid,args' | grep -E '^D'
$ ps -eo 'state,pid,args' | egrep '^D'
...