System Management
キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

ServiceGuard に関して

まさ2004
時折のビジター

ServiceGuard に関して

HP11.00 で ServiceGuard を使用しています。

cmhaltserv というコマンドをパッケージ制御ファイルの関数 halt_services から起動しているのですが、このコマンドの動作がよくわかりません。

マニュアルには以下のように書いてあるのですが、PIDが何のPIDを指しているのかがわかりません。

「このコマンドによって、SIGTERM シグナルがPID と監視中のサービスの対応するプロセスグループに送信されます。実行中のアプリケーションがシグナルを受信すると、アプリケーションによってプロセスが停止されます。」

パッケージ制御スクリプトの流れを考えると、モニタプロセスを停止しているのではないかと思うのですが。。。

また、test_return 9 の呼び出しの中で表示しているメッセージがログに載らないという現象も起きています。

どなたかわかる方いらっしゃいますか?
4 件の返信
テレコム担当者
尊敬されているコントリビューター

ServiceGuard に関して

検索可能ですが、以下の日本語資料があります。

ドキュメントID: UXSGKBAN00000157

ServiceGuardパッケージ フェイルオーバの理由

CASE 3 - パッケージサービスプロセスIDがなくなりました。

-------------------------------------------

ServiceGuardは、コントロールスクリプトを使用してパッケージのスタートアップと

シャットダウンを自動化します。コントロールスクリプトが「サービス」を開始する

と、サービスのプロセスID(PID)をServiceGuardのメインデーモン - cmcldに渡しま

す。cmcldがPIDのないのを検出すると、サービスの再開を試行します。

サービス再開の試行に失敗すると、ServiceGuardは恐らくパッケージを相手のホスト

に転送しようとするでしょう。Syslog.logメッセージは、PIDには触れませんが、

「サービス」を参照します。

オリジナルホストのsyslog.log

--------------------------

Jan 19 16:03:27 ion cmcld: Service pkg2_xclock in package pkg2 has gone down.

<-----

Jan 19 16:03:27 ion cmcld: Disable node ion from running package pkg2.

Jan 19 16:03:27 ion cmcld: Executing '/etc/cmcluster/pkg2/pkg.sh stop'

for package pkg2, as service PKG*22785.

Jan 19 16:03:27 ion cmcld: Service pkg2_xclock terminated due ton an exit(0).

Jan 19 16:03:29 ion CM-pkg2: cmhaltserv pkg2_xclock

Jan 19 16:03:32 ion LVM: vgchange -a n vg02

Jan 19 16:03:37 ion cmcld: Service PKG*22785 terminated due to an exit(0).

Jan 19 16:03:37 ion cmcld: Halted package pkg2 on node ion.

>マニュアルには以下のように書いてあるのですが、PIDが何のPIDを指しているのか

>がわかりません。

サービスのプロセスIDです。

上記では pkg2_xclock のプロセスIDの 9731 です。

oops
貴重なコントリビューター

ServiceGuard に関して

モニタプロセスとサービスプロセスはイコールでいいと思いますよ。

パッケージとは複数のサービスで構成されるもので、サービスはサービスコマンド(プロセス)と1対1になります。で、このサービスコマンド(プロセス)をモニターすることで、サービスに異常がないかどうかをモニターしているために、モニタープロセスとも言うのでしょうから。

例えば、pkg の conf ファイルに、

SERVICE_NAME pkg_serv1

SERVICE_FAIL_FAST_ENABLED NO

SERVICE_HALT_TIMEOUT 300

SERVICE_NAME pkg_serv2

SERVICE_FAIL_FAST_ENABLED NO

SERVICE_HALT_TIMEOUT 300

とあったとすると、control script には、以下のように、必ずこの二つのサービスに対するサービスコマンド(モニタープロセス)やリスタートの定義があるということです。

SERVICE_NAME=pkg_serv1

SERVICE_CMD="/usr/bin/X11/xclock -display 192.10.25.54:0"

SERVICE_RESTART=""

SERVICE_NAME=pkg_serv2

SERVICE_CMD="/usr/bin/X11/xload -display 192.10.25.54:0"

SERVICE_RESTART="-r 2"

cmhaltserv(1M)にはサービス名を指定しますが、このコマンドを実行すると、cntl script に定義されているサービス名に対応したサービスコマンドのPIDにシグナルを送信するということです。

test_return 9 のメッセージがログに載らないというのは、普通に考えると、cmhaltserv(1M)の戻り値が 0 ということなのではないですか?function halt_services に問題がなければ普通出ないもので、出るほうが問題だと思うのですが…

それとも、cmhaltserv の戻り値が 0 以外なのにメッセージが出ない場合について言及されているのですか?ちょっと仰ってる意味がよくわかりません。

function test_return はその直前のコマンドの戻り値を check して、0 以外の場合には WARNING や ERROR を表示するというものですよね?

まさ2004
時折のビジター

ServiceGuard に関して

テレコム担当者さん、oopsさんありがとうございます。

・cmhaltserv について

control script からは、直接アプリケーションを起動しているわけではなく、アプリケーションの生死の確認をおこなうモニタプロセス(シェル)を起動しているため、モニタプロセスという表現を使いました。この場合モニタ=サービスと考えていいということですね。

以下の流れになると考えてよいのでしょうか?

※pkg_01 はパッケージ名、pkg_01.sh は pkg_01 の起動コマンド

cmrunserv pkg_01 pkg_01.sh

(pkg_01.sh を実行し、PID をpkg_01 に結びつけて cmcld が保持)

  ↓

cmhaltserv pkg_01

(pkg_01 に結びついた PID に対して cmcld が SIGTERM を送信)

・test_return について

cmmakepkg にて control script のテンプレートを作成しますと、以下のように戻り値の判定をせずに test_return を呼び出す形になっています。ところが、control.sh.log には test_return 9 の呼び出しで表示されるはずのエラーメッセージが表示されていなかったため、これはなぜなのかが疑問点です。

-----------------------------------

# Halt each service using cmhaltserv(1m).

function halt_services

{

for I in ${SERVICE_NAME}

do

print "$(date '+%b %e %X') - Node \"$(hostname)\": Halting service $I"

cmhaltserv $I

test_return 9

done

}

-----------------------------------

まさ2004
時折のビジター

ServiceGuard に関して

・test_return について

自分で解決しました。

見落としてましたが、test_return の先頭に

if (( $? != 0 ))

という判定がありますね。。。