system management
1747980 メンバー
4769 オンライン
108756 解決策
新規ポスト

ServiceGuardのcmhaltpkgの動作について

 
kudou568
時折のアドバイザー

ServiceGuardのcmhaltpkgの動作について



環境はACT/SBY2台クラスタ構成、hp-ux11i、ServiceGuard(A11.16)です。

cmhaltpkgにてAというスクリプトを立ち上げます。

Aはsleepをwhileで回し、終わることはありません。

そのAからスクリプトBを起動し、スクリプトBからスクリプトCを起動します。

BはCを起動するとexitしますが、CはAと同様起動しっぱなしです。

ここである条件でCの中でスクリプトDを呼びCは終了。

Dの中でcmhaltpkgとcmrunpkg(別ノード指定で)を起動します。

ここで問題が発生しました。

このDの中で行っているcmhaltpkgを行うと、Dがいきなりいなくなってしまいます。

cmhaltpkgでいなくなるのはAだけだと思うのですが・・・。

Dもいなくなる為、cmrunpkgが実行されていないようです。

パッケージログ、シスログを見てもcmrunpkgが実行された形跡がないです。

ちなみにDをCからではなく、普通に実行するとhaltpkg、runpkg共に実行されます。

cmhaltpkgがAだけではなく、Dも終了させているのでしょうか?

cmhaltpkg実行直前のプロセスの親子関係はCはBがいなくなるためppid1に。Dも同様。

どなたか何かわかることがあればご教授願います。よろしくお願いします。
4件の返信4
oops
貴重なコントリビューター

ServiceGuardのcmhaltpkgの動作について

D の中での signal ハンドリングはどうなっていますか?

A が死んだことで SIGHUP シグナルが送信されたことが考えられます。

SIGHUP を無視するように nohup をつけて起動されるか、D の中で SIGHUP を無視するように trap をいれられたらどうですか?
kudou568
時折のアドバイザー

ServiceGuardのcmhaltpkgの動作について

返信ありがとうございます。

ご指摘のとおり、nohupをつけて起動するように変更してみましたが動作は変わりませんでした。

たぶん、ppidが1に変わっているので、Aが死んでもDにはSIGHUPは飛んでいかないんですよね?

(D の中で SIGHUP を無視するように trap を入れるというのは、ちょっとやり方がわからなかったのでやっていません。)
hazelwood
信頼あるコントリビューター

ServiceGuardのcmhaltpkgの動作について

Aから起動されたプロセスが何かリソースをつかんでいては、ちゃんとfail overできないと思います。

ですので、ServiceGuardはAのプロセスグループに対してシグナルを送って停止させているものと思います。

そもそも、パッケージの中からパッケージ制御コマンドを実行すること自体が乱暴だと思います。

代替案として、cmhaltpkg, cmrunpkgを実行するのではなく、(ServiceGuardが監視しているであろう)スクリプトAをkillするのではどうでしょうか?

これで、ServiceGuardが自分でFail Overしてくれると思いますが。
oops
貴重なコントリビューター

ServiceGuardのcmhaltpkgの動作について

レスが遅くなってすみません。

hazelwood さんの意見に賛成です。

パッケージ制御コマンドを使ってパッケージ制御機能自体を作り出そうとされているように見えますから、MC/SG のパッケージ制御機能の上で動作するスクリプトということを考えて作成されると良いかと思います。

後、SIGHUP というシグナルについて補足ですが、SIGHUP は親プロセスが死んだ時に子プロセスに送られるシグナルではありません。そういうシグナルはありません。子プロセスが死んだ時には親プロセスに SIGCHLD が飛びますが。

SIGHUP はプロセスグループリーダが死んだ時に、そのプロセスグループに属するプロセスに飛ぶシグナルです。