[解決済み] Uninterruptible Processとは何ですか?
質問
Linuxでプログラムを書いていて、何らかのバグでクラッシュすると、そのプログラムが中断できないプロセスになって、コンピュータを再起動するまで(ログアウトしても)永遠に動き続けることがあります。 私の質問は
- プロセスが中断されなくなる原因は何ですか?
- どうすればそれを阻止できますか?
- 馬鹿な質問かもしれませんが、パソコンを再起動せずに中断する方法はないのでしょうか?
解決方法は?
割り込み禁止プロセスとは、たまたまシステムコール(カーネル機能)の中にいて、信号で割り込むことができないプロセスのことです。
その意味を理解するためには、割り込み可能なシステムコールの概念を理解する必要があります。古典的な例としては
read()
. このシステムコールは、ハードディスクを回転させたり、ヘッドを移動させたりする可能性があるため、長い時間(数秒)を要することがあります。この間、プロセスはスリープし、ハードウェア上でブロックしています。
システムコールでプロセスがスリープしている間に、Unixの非同期シグナル(例えばSIGTERM)を受信することができ、その後次のようなことが起こります。
- システムコールが早期終了し、ユーザースペースに-EINTRを返すように設定されます。
- シグナルハンドラが実行される。
- プロセスがまだ実行中であれば、システムコールからの戻り値を取得し、同じ呼び出しを再度行うことができます。
システムコールから早期にリターンすることで、ユーザースペースのコードがシグナルに応答して即座に動作を変更することができます。例えば、SIGINTやSIGTERMに反応してきれいに終了させることができます。
一方、この方法での割り込みが許されないシステムコールもあります。何らかの理由でシステムコールが停止した場合、プロセスはいつまでもこの不殺生状態にとどまることができる。
LWNは いい記事 7月にこの話題に触れました。
最初の質問に答えます。
-
これを防ぐには: トラブルの原因となっているドライバを突き止め、使用をやめるか、カーネルハッカーになってそれを修正します。
-
中断できないプロセスを再起動せずに終了させる方法:何らかの方法でシステムコールを終了させる。電源スイッチを押さずにこれを行う最も効果的な方法は、しばしば、電源コードを引くことです。また、LWN の記事で説明されているように、カーネルハッカーになって、ドライバに TASK_KILLABLE を使用させることも可能です。
関連
-
Linux sarコマンドによるシステム性能の詳細解析事例
-
Vmware 16仮想マシンを開けない場合、ファイルをローカルにコピーする方法は?
-
Linux MintのデスクトップでNoteをイタリックにすることは可能ですか?
-
[解決済み] C言語のコードで「:-!」とは何ですか?
-
[解決済み] Linuxで特定のポートで動作しているプロセスを停止させる方法は?
-
[解決済み] POSIX」の意味を教えてください。
-
[解決済み] bashスクリプトでset -eはどういう意味ですか?
-
[解決済み] アプリケーションやプロセスの実際のメモリ使用量を測定するにはどうすればよいですか?
-
[解決済み] 何が私のプロセスを殺したのか、なぜなのか?
-
[解決済み] バックグランドプロセスのプロセスIDを取得する方法を教えてください。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Vmware 16仮想マシンを開けない場合、ファイルをローカルにコピーする方法は?
-
deepin20のソフトをアンインストールする方法を教えてください。deepinのアプリケーションをアンインストールする2つの方法
-
TclError: 表示名がなく、$DISPLAY環境変数もない。
-
Process.waitFor()の戻り値の意味するところ
-
[解決済み] IOCTL Linuxデバイスドライバ [終了しました]
-
[解決済み] bash sh - command not found [重複].
-
[解決済み] 出力をファイルや標準出力にリダイレクトする方法
-
[解決済み] どのバージョンのPostgreSQLを使用していますか?
-
[解決済み] エクスポートあり/なしの変数の定義
-
[解決済み] ls を使用してディレクトリとその合計サイズを一覧表示する