2006年 9月 26日 火曜日
やっぱり Sun がスキ!
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 に登録しています。
( 実際に登録したスクリプトです ==> ファイル)
-
まず system-log ( syslog ) サービスの SMF Profile を利用する為、 syslogd の profile をコピーします。
# cp /var/svc/manifest/system/system-log.xml /var/svc/manifest/system/test.xml
-
次にコピーした /var/svc/manifest/system/test.xml ファイルの 必要な箇所のみ残し、編集します。
( ここのリンク先にあるファイルから、★のたった5カ所を編集するだけで良いと思います。 ) -
編集した 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: インポートが成功しました。 #
-
実際にサービスが登録されているか確認します。
( 今回は system/test というサービス名です。)# svccfg list | grep test system/test # # svcs -a | grep test disabled 21:29:30 svc:/system/test:default #
-
登録しただけではまだ有効になっていない為、svcadm コマンドを 使用してサービスを有効化します。
# svcadm disable svc:/system/test:default # svcadm enable svc:/system/test:default
-
実際にサービスが動いているか、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 にも具体例などを用いて説明がありますので、
これらも参考に頂ければと思います。
参考資料
-
Sun BluePrints Online - Service Management Facility (SMF) in the Solaris 10 OS
http://www.sun.com/blueprints/0206/819-5150.html -
Solaris 10 System Administrator Collection - Japanese ==>> 14. サービスの管理 (概要)
http://docs.sun.com/app/docs/doc/819-0378/6n2qdlvum?a=view -
Solaris 10 System Administrator Collection - Japanese ==>> 15. サービスの管理 (手順)
http://docs.sun.com/app/docs/doc/819-0378/6n2qdlvv3?a=view - Man page smf(5), svc.startd(1M), smf_method(5), etc...
Posted at 04:21午後 9 26, 2006 by Naoyuki Yamada in Sun | 投稿されたコメント[1]