やっぱり Sun がスキ! : Weblog やっぱり Sun がスキ!

やっぱり Sun がスキ!

http://blogs.sun.com/yappri/date/20060926 2006年 9月 26日 火曜日

SMF ( Service Management Facility )

SMF ( Service Management Facility )

皆様の中でシステムの起動と同時にデーモンプログラム (サービス)を起動させたい場合、/etc/rc*.d 配下に 起動・停止スクリプトを登録されているかと思います。

しかし、この方法では何らかの理由でプログラムが停止 してしまった場合に、通常は自動的に再起動を行ってくれません。

そのような時の為に Solaris 10 から追加された、サービス管理機能 ( SMF : Service Management Facility ) を利用してみてはいかがでしょうか。

この機能を利用すれば、別途、Watchdog 用のプロセスやスクリプトを 作成しなくても、SMF の機能の中でプロセスの監視を行ってくれ、 障害発生時にはそのプログラムを自動的に再起動してくれるため 非常に便利です。

この便利なフレームワークを利用するには、rc スクリプトの代わりに SMF 用設定ファイル ( SMF Profile ) を作成する必要がありますが、 今回はすでに標準で SMF に登録されてる system-log ( syslog ) サービスの 設定ファイルを利用・コピーして、新しくサービスを登録する例を紹介したいと思います。

※ 今回はテストのため、「 sleep コマンドを実行するスクリプト」を作成し、新しいサービスとして SMF に登録しています。
  ( 実際に登録したスクリプトです ==> ファイル)

  1. まず system-log ( syslog ) サービスの SMF Profile を利用する為、 syslogd の profile をコピーします。

    	# cp /var/svc/manifest/system/system-log.xml /var/svc/manifest/system/test.xml
    
  2. 次にコピーした /var/svc/manifest/system/test.xml ファイルの 必要な箇所のみ残し、編集します。

    ( ここのリンク先にあるファイルから、★のたった5カ所を編集するだけで良いと思います。 )

  3. 編集した SMF Profile を、svccfg コマンドを使用して新しいサービスとして登録します。

    	# svccfg -v import /var/svc/manifest/system/test.xml
    	svccfg: svc:/system/test:default の "initial" スナップショットを作成しています。
    	svccfg: svc:/system/test:default の "last-import" スナップショットを作成しています。
    	svccfg: svc:/system/test:default が再表示されました。
    	svccfg: svc:/milestone/multi-user:default が再表示されました。
    	svccfg: インポートが成功しました。
    	# 
    
  4. 実際にサービスが登録されているか確認します。
    ( 今回は system/test というサービス名です。)

    	# svccfg list | grep test
    	system/test
    	# 
    	# svcs -a | grep test
    	disabled       21:29:30 svc:/system/test:default
    	# 
    
  5. 登録しただけではまだ有効になっていない為、svcadm コマンドを 使用してサービスを有効化します。

    	# svcadm disable svc:/system/test:default
    	# svcadm enable svc:/system/test:default
    
  6. 実際にサービスが動いているか、svcs コマンドを利用して確認します。

    	# svcs -pl svc:/system/test:default
    	fmri         svc:/system/test:default
    	name         Test Deamon
    	有効         true
    	状態         online
    	next_state   none
    	state_time   2006年09月22日 (金) 21時30分12秒
    	logfile      /var/svc/log/system-test:default.log
    	リスタータ   svc:/system/svc/restarter:default
    	contract_id  2295 
    	dependency   require_all/none svc:/milestone/sysconfig (online)
    	process      16541 /usr/bin/csh /var/tmp/sleep.sh
    	process      16542 sleep 1000000
    	process      16543 sleep 2000000
    	process      16544 sleep 3000000
    	# 
    

以上で登録は終了です。

svcs -pl コマンドの process .... の箇所が、実際に動いているプロセスと PID です。

それではここで、自動再起動のテストを行う為、 子プロセスを一つ強制停止させてみます。

  • 現在のサービスの状態を確認する為、svcs コマンドを実行します。
    ( 特に PID に注目下さい。 )
    	# svcs -pl svc:/system/test:default
    	fmri         svc:/system/test:default
    	name         Test Deamon
    	有効         true
    	状態         online
    	next_state   none
    	state_time   2006年09月22日 (金) 21時30分12秒
    	logfile      /var/svc/log/system-test:default.log
    	リスタータ   svc:/system/svc/restarter:default
    	contract_id  2295 
    	dependency   require_all/none svc:/milestone/sysconfig (online)
    	process      16541 /usr/bin/csh /var/tmp/sleep.sh
    	process      16542 sleep 1000000
    	process      16543 sleep 2000000
    	process      16544 sleep 3000000 <== 強制停止する子プロセス
    	# 
  • 次に、先程 svcs コマンドで確認したプロセスの中から、 子プロセスを一つ強制停止させます。
    	# kill -KILL 16544
    	# 
  • 再度、サービスの状態を確認する為、svcs コマンドを実行します。
    	# svcs -pl svc:/system/test:default
    	fmri         svc:/system/test:default
    	name         Test Deamon
    	有効         true
    	状態         online
    	next_state   none
    	state_time   2006年09月22日 (金) 21時31分14秒
    	logfile      /var/svc/log/system-test:default.log
    	リスタータ   svc:/system/svc/restarter:default
    	contract_id  2296 
    	dependency   require_all/none svc:/milestone/sysconfig (online)
    	process    ★16551 /usr/bin/csh /var/tmp/sleep.sh
    	process    ★16552 sleep 1000000
    	process    ★16553 sleep 2000000
    	process    ★16554 sleep 3000000
    	# 

上記の出力結果を御確認頂くと、kill コマンドで子プロセスを強制停止させた後に 全てのプロセスが自動的に再起動して、PID が変化している事が確認できるかと思います。

これだけの簡単な手順で、プロセスの監視と、必要な場合にはサービスの再起動を行う事ができます。

皆様も是非、既存のプロセスを SMF に登録してみてはいかがでしょうか!


下記のマニュアルや Blueprint にも具体例などを用いて説明がありますので、 これらも参考に頂ければと思います。

参考資料