3つのOracleインスタンスを備えたサーバーがあり、ファイルシステムはnetappを備えたnfsです。データベースをシャットダウンした後、データベースごとに1つのプロセスが長時間終了しません。各kill-iは機能しません。私はそれをトラスし、pfileし、エラーを介してコマンドを実行しようとしました。
そしてiostatは、netappサーバーへのIOがたくさんあることを示しています。そのため、プロセスがリモートnetappサーバーへのデータの書き込みでビジーであり、書き込みが完了する前に終了しないと誰かが言いました。実行する必要があるのは、すべてのIOが実行されるまで待つことだけでした。
より長い時間(約1.5時間)待機した後、プロセスは終了します。
だから私の質問は:プロセスがkillシグナルを無視するにはどうすればよいですか?私の知る限り、-9を殺すとすぐに止まります。あなたはそのような状況に遭遇しますか?私はプロセスをすぐに殺しませんか?
TEST7-stdby-phxdbnfs11 $> ps -ef | grep dbw0 Oracle 1469 25053 0 22:36:53 pts/1 0:00 grep dbw0 Oracle 26795 1 0 21 :55:23? 0:00 ora_dbw0_TEST7 Oracle 1051 1 0 2008年4月? 3958:51 ora_dbw0_TEST2 Oracle 471 1 0 Apr 08? 6391:43 ora_dbw0_TEST1 TEST7-stdby-phxdbnfs11 $> kill -9 1051 TEST7-stdby-phxdbnfs11 $> ps -ef | grep dbw0 Oracle 1493 25053 0 22:37 :07 pts/1 0:00 grep dbw0 Oracle 26795 1 0 21:55:23? 0:00 ora_dbw0_TEST7 Oracle 1051 1 0 2008年4月? 3958:51 ora_dbw0_TEST2 Oracle 471 1 0 Apr 08? 6391:43 ora_dbw0_TEST1 TEST7-stdby-phxdbnfs11 $> kill -9 471 TEST7-stdby-phxdbnfs11 $> ps -ef | grep dbw0 Oracle 26795 1 0 21:55 :23? 0:00 ora_dbw0_TEST7 Oracle 1051 1 0 2008年4月? 3958:51 ora_dbw0_TEST2 Oracle 471 1 0 Apr 08? 6391:43 ora_dbw0_TEST1 Oracle 1495 25053 0 22:37:22 pts/1 0:00 grep dbw0 TEST7-stdby-phxdbnfs11 $> ps -ef | grep smon Oracle 1524 25053 0 22:38:02 pts/1 0:00 grep smon TEST7-stdby-phxdbnfs11 $> ps -ef | grep dbw0 Oracle 1526 25053 0 22:38:06 pts/1 0:00 grep dbw0 Oracle 26795 1 0 21:55:23? 0:00 ora_dbw0_TEST7 Oracle 1051 1 0 2008年4月? 3958:51 ora_dbw0_TEST2 Oracle 471 1 0 Apr 08? 6391:43 ora_dbw0_TEST1 TEST7-stdby-phxdbnfs11 $> kill -9 1051 471 26795 TEST7-stdby-phxdbnfs11 $> ps -ef | grep dbw0 Oracle 1528 25053 0 22 :38:19 pts/1 0:00 grep dbw0 Oracle 26795 1 0 21:55:23? 0:00 ora_dbw0_TEST7 Oracle 1051 1 0 2008年4月? 3958:51 ora_dbw0_TEST2 Oracle 471 1 0 Apr 08? 6391:43 ora_dbw0_TEST1 TEST7-stdby-phxdbnfs11 $> truss -p 26795 truss:予期しないシステムエラー:26795 TEST7-stdby -phxdbnfs11 $> pfiles 26795 pfiles:予期しないシステムエラー:26795
プロセスは、「ユーザースペース」にある場合にのみ、KILLシグナル(すべてのシグナルは同じように動作します)を取得します。カーネルスペースにある場合(たとえば、NFS共有がファイルから読み取ったデータを配信するのを待っている場合)、シグナルを取得しません(シグナルは、プロセスがユーザースペースに戻るまで待機し、失われることはありません)。
ほとんどのNFSDにはこれに関するいくつかのオプションがあり、タイムアウトした場合は失敗ステータスで読み取りから戻ることができます。すべてのプログラムがすべてのread()
の結果をチェックするわけではないため、これによりデータが失われます(他のオプションと同様)。
プロセスはKILLシグナルを無視/キャンセルすることはできません。これは通知のみであり、必要なデータを保存する機会を与えます。
質問ではクライアントプラットフォームが指定されていなかったので、Linuxを想定しています。
関連するFAQ を参照してください。
プロセスはSIGKILLを無視できませんが、syscallはシグナルの処理をブロックできます。
これを回避するために使用できるLinuxクライアントのマウントフラグは、soft
とintr
の2つです。
soft
により、要求が失敗したときにNFSは最終的にあきらめます。アプリケーションがsyscallの失敗に直面しても堅牢になるように適切に記述されていない場合(そして、多くのアプリケーションがそのように記述されていない場合)、データが破損する可能性があります。
intr
は、soft
よりも安全な方法でNFSシステムコールを割り込み可能にしようとします。ただし、intr,hard
マウントを強制終了できない状態にすることは可能です。