65

Web サイトにアクセスしたときにテキスト文字列を自動的に強調表示するプラグインを作成しています。ハイライト検索結果に似ていますが、自動で多くの単語が検索されます。アレルギーのある人が食品サイトをブラウジングするときなど、単語を目立たせるために使用できます。

しかし、私には問題があります。空の新鮮な FF ウィンドウを閉じようとすると、どういうわけかプロセス全体がブロックされます。プロセスを強制終了すると、すべてのウィンドウが消えますが、Firefox プロセスは存続します (親 PID は 1 で、シグナルをリッスンせず、多くのリソースが開いていて、CPU を消費しますが、動きません)。

2つの質問:

  1. プロセスが kill -9 (ユーザーとしてもルートとしても) をリッスンしないのはどうしてですか?

  2. 再起動以外にできることはありますか?

[編集] これは問題のあるプロセスです:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
digulla  16688  4.3  4.2 784476 345464 pts/14  D    Mar28  75:02 /opt/firefox-3.0/firefox-bin

と同じps -ef | grep firefox

UID        PID  PPID  C STIME TTY          TIME CMD
digulla  16688     1  4 Mar28 pts/14   01:15:02 /opt/firefox-3.0/firefox-bin

残る工程はこれだけです。ご覧のとおり、ゾンビではなく、走っています! PID で kill しても、名前で kill しても、kill -9 をリッスンしません! に接続しようとするとstracestraceもハングして強制終了できません。出力もありません。私の推測では、FF はいくつかのカーネル ルーチンでハングしますが、どのルーチンがハングしますか?

[EDIT2] sigjuice によるフィードバックに基づく:

ps axopid,comm,wchan

プロセスがハングするカーネル ルーチンを表示できます。私の場合、問題のあるプラグインは Beagle Indexer (openSUSE 11.1) でした。プラグインを無効にした後、FF は再び迅速で幸せなキツネになりました。

4

7 に答える 7

125

OP へのコメントに記載されているように、プロセス ステータス ( STAT) はD、プロセスが「割り込み不可能なスリープ」状態であることを示します。現実世界の用語では、これは通常、I/O を待機していて、その I/O 操作が完了するまで何もできない/できないことを意味します。

状態のプロセスは、通常、操作が完了して/Dに戻るまでのほんの一瞬だけ存在します。私の経験では、プロセスが動かなくなった場合RSDほとんどの場合、到達不能な NFS やその他のリモート ファイルシステムと通信しようとしたり、障害のあるハード ドライブにアクセスしようとしたり、不安定なデバイス ドライバーを介してハードウェアの一部を利用したりしています。このような場合、回復してプロセスを終了させる唯一の方法は、fs/ドライブ/ハードウェアをバックアップして実行し、I/O が完了できるようにするか、あきらめてシステムを再起動することです。NFS の特定のケースでは、マウントが最終的にタイムアウトになり、I/O 操作から (失敗コードで) 戻ることもありますが、これはマウント オプションに依存し、NFS マウントが永久に待機するように設定されることは非常に一般的です。 .

これは、ステータスが のゾンビ プロセスとは異なりますZ

于 2009-03-31T14:07:48.057 に答える
8

親 ID が本当に 1 であることを再確認してください。そうでなく、これが である場合はfirefox、まず を試してくださいsudo killall -9 firefox-bin。その後、特定のプロセス ID を個別に kill してみてくださいsudo killall -9 [process-id]

プロセスが kill -9 (ユーザーとしてもルートとしても) をリッスンしないのはどうしてですか?

プロセスが終了し、親が 1 のゾンビになった場合、<defunct>手動プロセスを強制終了することはできません。しかinitできません。ゾンビ プロセスは既に死んでおり、プロセスではなく、プロセス テーブル エントリとそれに関連付けられた終了コードのみが収集されるのを待っているため、強制終了する機能を失いました。親を殺す必要がありますがinit、明らかな理由で殺すことはできません。

ただし、より一般的な情報については、こちらを参照してください。当然、再起動するとすべてが殺されます。

于 2009-03-29T14:44:37.577 に答える
1

このプロセスを強制終了した直後に (たとえば init によって) 再起動される可能性はありますか?

これは簡単に確認できます。その後、PID が同じであるkill -9 PID場合、プロセスは強制終了されていませんが、変更されている場合、プロセスは再起動されています。

于 2009-03-29T15:12:27.497 に答える
0
sudo killall -9 firefox

動作するはずです

編集: [PID] を Firefox に変更

于 2009-03-29T14:42:39.877 に答える
0

ps -ef | grep Firefox; 3つのプロセスが表示され、それらをすべて強制終了します。

于 2009-03-29T14:44:02.323 に答える
0

pstree を実行して親を強制終了することもできます。これにより、リーフだけでなく、問題のあるプロセス ツリー全体を確実に取得できます。

于 2009-03-29T15:09:47.597 に答える