Q

Windows 2000 Serverが稼働するサーバー・マシンをシャットダウンすると,あるサービスで使用されるデータベースが破損することが時々あります。サービスの終了処理が終わる前にOSが強制終了させてしまっているのが原因のようです。

 停止するまでに時間がかかるサービスを確実に正常終了させるにはどのようにすればよいでしょうか。

A

OSのシャットダウン時,Windowsのシステム・プロセスの1つである「サービス・コントロール・マネージャ(SCM)」が各サービスにシャットダウン・コマンド(SERVICE_CONTROL_SHUTDOWN)を送ります。各サービスはこのコマンドを受けて終了処理に入ります。通常,サービスは必要な終了処理を各自で済ませて実行を終えます。しかし,一定のタイムアウト時間内に終わらなかった場合は,SCMが強制終了させてしまいます。トラブルを起こしているサービスは,この時間内に終了できないために強制終了させられてしまっているのでしょう。

 1つの対処方法は,タイムアウト時間を長く取ることです。デフォルトでは20秒に設定されていますが,図9のレジストリ・キーを編集することで1000分の1秒単位で設定できます。ただ,適切なタイムアウト時間が一体何秒であるかは,そのシステムの構成によって異なります。トライ&エラーで少しずつ調整しながら探し出すしかありません。この問題については,サポート技術情報も参照してください(146092,184124)。

図9●サービス終了待ちのタイムアウトを設定する
サービス・サブシステムがシャットダウン・コマンドを発行してからサービスを強制終了するまでのタイムアウト時間を1000分の1秒単位で設定できる。デフォルトでは「20000(20秒)」に設定されている。

 また,SCMはサービス同士の依存関係を考慮せずにシャットダウン処理を行います(サポート技術情報203878)。文字通り“片っ端から”終了させようとするので,“あるサービスを別のサービスより先に終了したい”というような細かい制御はできません。一定の順序で終了させたいサービスがある場合は,シャットダウン・スクリプトを用いるとよいでしょう。



△ 図をクリックすると拡大されます
図10●シャットダウン・スクリプトの設定

 シャットダウン・スクリプトは,OSの標準的なシャットダウン・プロセスの前に実行されます。Windows 2000以降に備わる機能で,グループ・ポリシーで設定できます(図10)。シャットダウン・スクリプトの実行は「同期的」で,実行が完了するまで標準のシャットダウン・プロセスには移りません。正常終了させようとするサービスを止めるnet stopコマンドを希望する順序で書いておけば,意図した通りに終了できます。シャットダウン・スクリプトの設定についてはサポート技術情報も参照してください(322241,198642)。

 シャットダウン・スクリプトを書くときには,スクリプトの実行が完了するように注意して作ってください。例えば,スクリプト中にユーザーからの入力を待つコマンドがあると,完了しないスクリプトになってしまいます。

 このようなスクリプトを割り当てると,“シャットダウンスクリプトを実行しています…”というダイアログ表示のままOSのシャットダウン処理が止まってしまいます。万一,この状態に陥った場合は,ターミナル・サービスやtelnetなどでネットワーク越しにログオンし,タスク・マネージャやkill.exeで,SYSTEMユーザーが実行するcmd.exeを終了させてください。

小森 博司