Q

△ 図をクリックすると拡大されます
図4●Windows2000以降の環境では終了時に実行する処理をシャットダウン・スクリプトとして定義できる

Windows 2000以降では,グループ・ポリシーやローカル・ポリシーでシャットダウン・スクリプトを実行できるようになりました(図4)。この機能をいろいろと活用したいと思っているのですが,スクリプトが実行されるタイミングが今ひとつよく分かりません。例えば,データベースの停止処理などを実行したいと考えているのですが,スクリプトが実行される時点ではもうサービスが停止しているのでしょうか?


A

システムのシャットダウン時に決まった処理を実行するシャットダウン・スクリプトは便利な機能ですが,実行されるタイミングについては正確な資料がありません。このため,実際に使用する際には使い方に迷うケースがあります。

コンソールのプログラムのみが終了
 そこで,Windows Server 2003のローカル・ポリシーを使用して実際に確認してみました。結論から言いますと,ログオフ・スクリプトは(1)対話的にローカル・ログオンしたユーザーはログオフ済み(コンソール・セッションは終了),(2)ターミナル・サービスでログオンしたユーザーはログオフされていない,(3)サービスは実行中,――というタイミングで実行されていました。このため,サービスとして起動しているデータベースの停止処理であれば,シャットダウン・スクリプト内で実行しても適切だと考えられます。

 シャットダウン・スクリプトが実行されるタイミングは,サポート・ツールなどに含まれているtlist.exe(WindowsXP/2003ではtasklist.exeとしても標準で装備)のような,タスクを一覧するコマンドをシャットダウン・スクリプトとして設定し,その実行結果を調べてみると分かります。


△ 図をクリックすると拡大されます
図5●実行中のタスクを一覧表示するtlist.exeを実行してみれば,シャットダウン・スクリプトが実行されるタイミングが分かる

スクリプト内でtlistを実行して調査
 例えば,Windows Server 2003で,コンソール・セッションからはcalc.exeを,ターミナル・セッションからはnotepad.exeを起動した状態で,コマンド・プロンプトから「tlist -t」を実行するとプロセスID付きのタスク・ツリーが表示されます(図5)。

 これを,「tlist -e」の結果と突き合わせると,コンソール・セッションとなるセッション0のシェルexplorer.exe(プロセスIDが3400)からcalc.exe(同3700)が起動されていることが分かります。同様に,ターミナル・セッションを表すセッション3のシェルexplorer.exe(同1668)からnotepad.exe(同1120)が起動されていることも分かりました。また,セッション0では,ServiceControl Managerであるservices.exe(同524)が各種サービスのプロセス(プロセスIDが2252のwmiprvse.exeなど)を起動していることが分かります。

 この後,シャットダウン・スクリプトで同様の「tlist-t」と「tlist-e」を実行してみます。すると,まずシャットダウン・スクリプト自体は,ユーザーのログオン処理と同様にuserinit.exe(同1528)の子プロセスとして起動されていることが分かります。

 プロセスの状況を見ると,セッション0(コンソール・セッション)のシェルexplorer.exe(同3400)とcalc.exe(同3700)がなくなっている一方,セッション3(ターミナル・セッション)のシェルexplorer.exe(同1668)とnotepad.exe(同1120)は実行中である ことが分かります。また,セッション0ではService Control Managerのservices.exe(同524)の子プロセスである各種サービスのプロセスもまだ実行中であることが分かります。

終了できないケースを想定しておこう
 シャットダウン・スクリプトを使う際には,それ以外にもいくつか気を付けたい点があります。


△ 図をクリックすると拡大されます
図6●グループ・ポリシーで実行中のシャットダウン・スクリプトの内容を表示するようにできる

 プロンプトからユーザーの入力が必要になるような処理を実行するなど,完了しないシャットダウン・スクリプトを誤って設定してしまった場合には,[シャットダウンスクリプトを実行しています…]というダイアログを表示したままOSのシャットダウン処理が進行しません。ポリシーで[コンピュータの構成]-[管理用テンプレート]-[システム]-[スクリプト]にある[実行中のシャットダウンスクリプトを表示する]を[有効]に構成しておくと,実行中の状況が確認できるようになります。そうすることにより,仮にこのような状況を引き起こしても対処できます(図6)。

 また,完了しないシャットダウン・スクリプトは,デフォルトで10分(600秒)で強制終了させられます。このタイムアウト時間を変更する場合,[コンピュータの構成]-[管理用テンプレート]-[システム]-[スクリプト]にある[スクリプトの実行時間の上限を設定する]で設定します。

小森 博司