« shutdown immeidateしない、ほかの理由に遭遇! #3 | トップページ | shutdown immeidateしない、ほかの理由に遭遇! おまけのおまけ(でた〜最近、よくあるパターンw) »

2011年2月10日 (木) / Author : Hiroshi Sekiguchi.

shutdown immeidateしない、ほかの理由に遭遇! おまけ

前回までで状況も把握できたし、そうなった場合の回避策も見えたのですが、子プロセスの生成とかdefunctなゾンピ君の刈り取りってどーなってんだろーと気になり…

子プロセスの生成状況を以下の順で見てみる…

  1. shellに入っただけ
  2. SQL*Plus起動
  3. SCOTTユーザへ接続
  4. host command(!)でshellへ入る


shellに入っただけ

[oracle@pleco ˜]$ 
[oracle@pleco ˜]$

[oracle@pleco ˜]$ 
[oracle@pleco ˜]$ ps -e -u oracle | grep gnome-terminal
3337 ? 00:00:09 gnome-terminal
[oracle@pleco ˜]$
[oracle@pleco ˜]$ pstree -p 3337 -u
gnome-terminal(3337,oracle)─┬─bash(3377)
├─bash(3737)───pstree(4063)
├─gnome-pty-helpe(3342)
└─{gnome-terminal}(3344)


SQL*Plus起動

[oracle@pleco ˜]$ 
[oracle@pleco ˜]$
[oracle@pleco ˜]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.7.0 - Production on 木 2月 10 14:54:44 2011

Copyright (c) 1982, 2008, Oracle. All rights reserved.

14:54:44 >

[oracle@pleco ˜]$ 
[oracle@pleco ˜]$ pstree -p 3337 -u
gnome-terminal(3337,oracle)─┬─bash(3377)───sqlplus(4064)
├─bash(3737)───pstree(4066)
├─gnome-pty-helpe(3342)
└─{gnome-terminal}(3344)


SCOTTユーザへ接続

[oracle@pleco ˜]$ 
[oracle@pleco ˜]$
[oracle@pleco ˜]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.7.0 - Production on 木 2月 10 14:54:44 2011

Copyright (c) 1982, 2008, Oracle. All rights reserved.

14:54:44 > conn scott/tiger
接続されました。
14:54:57 SCOTT>

scottユーザに接続した状態…
このようにSQL*Plusの子プロセスが1つであればshutdown immeidateが待機させられることはないんだけど…ね。
[oracle@pleco ˜]$ 
[oracle@pleco ˜]$ pstree -p 3337 -u
gnome-terminal(3337,oracle)─┬─bash(3377)───sqlplus(4064)───oracle(4067)
├─bash(3737)───pstree(4068)
├─gnome-pty-helpe(3342)
└─{gnome-terminal}(3344)


host command(!)でshellに入った

[oracle@pleco ˜]$ 
[oracle@pleco ˜]$
[oracle@pleco ˜]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.7.0 - Production on 木 2月 10 14:54:44 2011

Copyright (c) 1982, 2008, Oracle. All rights reserved.

14:54:44 > conn scott/tiger
接続されました。
14:54:57 SCOTT> !
[oracle@pleco ˜]$

SQL*Plusからホストコマンド(!)でshellに入った状態…
SQL*Plusの子プロセスが複数でoracle以外のがある状態で、他のSQL*Plusからshutdown immediateを実行されちゃうと、以下にあるpid=4067が<defunct>状態のまま刈り取られない。===>Oracleがshutdown immeidateで停止しない。ってことになるのな。
[oracle@pleco ˜]$ 
[oracle@pleco ˜]$ pstree -p 3337 -u
gnome-terminal(3337,oracle)─┬─bash(3377)───sqlplus(4064)─┬─bash(4069)
└─oracle(4067)
├─bash(3737)───pstree(4093)
├─gnome-pty-helpe(3342)
└─{gnome-terminal}(3344)
[oracle@pleco ˜]$
[oracle@pleco ˜]$

じゃ、実験!

以下のようにshutdown immeidateが待機させられている状態を作る。赤字(pid=3627)の子プロセスがdefunctつまりゾンビになるわけね。

shutdown immeidateを実行するSQL*Plusとは別にSQL*Plusを起動し、host command(!)でshellに入っておきます…

16:09:28 > conn scott/tiger
接続されました。
16:12:45 SCOTT> !
[oracle@pleco ˜]$

[oracle@pleco ˜]$ pstree -p 3372 -u
gnome-terminal(3372,oracle)─┬─bash(3378)───sqlplus(3493)─┬─bash(3628)
└─oracle(3627)
├─bash(3403)───sqlplus(3427)───oracle(3599)
├─bash(3520)───pstree(3672)
├─gnome-pty-helpe(3377)
└─{gnome-terminal}(3379)

この状態で、もう一つのSQL*Plusからsysユーザでshutdown immeidateを実行します…shutdown immeidateは待機させられます。
この時、pid=3627の子プロセスはdefunct状態になってますが、刈り取られていません。この影響でshutdown immediateが待機させられています。
SQL*Plusからshellに入っていない場合、つまり、SQL*Plusのプロセス(pid=3493)の子プロセスが1つしかない場合は、shutdown immeidateが待機させられることはない…この辺りに問題がありそうな気がします…

16:12:59 SYS> 
16:12:59 SYS>
16:13:00 SYS> shutdown immediate

[oracle@pleco ˜]$ pstree -p 3372 -u
gnome-terminal(3372,oracle)─┬─bash(3378)───sqlplus(3493)─┬─bash(3628)
└─oracle(3627)
├─bash(3403)───sqlplus(3427)───oracle(3599)
├─bash(3520)───pstree(3672)
├─gnome-pty-helpe(3377)
└─{gnome-terminal}(3379)

試しに親プロセスであるSQL*Plus(pid=3493)にSIGCHLDシグナルを送ってみましょう。
[oracle@pleco ˜]$ kill -SIGCHLD 3493
[oracle@pleco ˜]$ kill -SIGCHLD 3493
[oracle@pleco ˜]$ kill -SIGCHLD 3493
[oracle@pleco ˜]$ kill -SIGCHLD 3493
[oracle@pleco ˜]$ kill -SIGCHLD 3493
・・・・以下略w・・・・

ん〜〜〜〜〜。ゾンビを刈り取ってくれません><

試しにshellからexitしてみます…

16:09:28 > conn scott/tiger
接続されました。
16:12:45 SCOTT> !
[oracle@pleco ˜]$ exit
exit

16:18:24 SCOTT>
[oracle@pleco ˜]$ pstree -p 3372 -u
gnome-terminal(3372,oracle)─┬─bash(3378)───sqlplus(3493)───oracle(3627)
├─bash(3403)───sqlplus(3427)───oracle(3599)
├─bash(3520)───pstree(3673)
├─gnome-pty-helpe(3377)
└─{gnome-terminal}(3379)

shellからはexitしました。SQL*Plus(pid=3493)の子プロセスがoracleだけ(pid=3627)のゾンビだけになりました。oracleのゾンビ(pid=3627)が残っているうちはshutdown immeidateは待機させられたままです! 

では、もう一回、親プロセスであるSQL*PlusにSIGCHLDシグナルを送ってみましょう! 今度はうまく行きそうな気がします!

[oracle@pleco ˜]$ kill -SIGCHLD 3493
[oracle@pleco ˜]$ pstree -p 3372 -u
gnome-terminal(3372,oracle)─┬─bash(3378)───sqlplus(3493)
├─bash(3403)───sqlplus(3427)───oracle(3599)
├─bash(3520)───pstree(3675)
├─gnome-pty-helpe(3377)
└─{gnome-terminal}(3379)
[oracle@pleco ˜]$

やった〜〜〜〜〜〜 :) SQL*Plus(pid=3493)の子プロセス(pid=3627)のゾンビが見事に刈り取られました!

その瞬間……待機させられていたshutdown immeidateは見事終了!!!!

16:12:59 SYS> 
16:12:59 SYS>
16:13:00 SYS> shutdown immediate
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
16:18:42 SYS>


shutdown immeidateしない、ほかの理由に遭遇! ネタはこれにて :)




shutdown immeidateしない、ほかの理由に遭遇!
shutdown immeidateしない、ほかの理由に遭遇! #2
shutdown immeidateしない、ほかの理由に遭遇! #3
shutdown immeidateしない、ほかの理由に遭遇! おまけ

| |

トラックバック


この記事へのトラックバック一覧です: shutdown immeidateしない、ほかの理由に遭遇! おまけ:

コメント

コメントを書く