Windows 2008 ServerでUPSと連動させた自動シャットダウン時のタスク実行
東日本大震災の被災者の方々に心からお見舞いを申し上げます。
まだまだ余震が続き、計画停電が続く中、UPSに接続したサーバシャットダウン時に別サーバ(UPSと非連動)へシャットダウンイベントを渡したくなった。
Windows 2008 Serverのタスクスケジューラをみても「シャットダウン時に実行」という項目が見当たらない。
調べてみるとWindows Vista以降のOSでは(Windows XPが手元にないのでVista前では未確認)シャットダウン時にタスクを自動実行できないようだ。
UPSの電源を抜き差ししながらイベントログを見ていると
警告:APC UPS Service 停電のためUPSはバッテリ運転に移行しました。 ログの名前:アプリケーション ソース:APC UPS Service イベントID:174 レベル:警告 ユーザ:SYSTEM
とでている。
また、電源を戻した際には
情報:APC UPS Service UPSは商用電源に移行しました。 ログの名前:アプリケーション ソース:APC UPS Service イベントID:61455 レベル:情報 ユーザ:SYSTEM
なので、下記のようなスクリプトを作成
shutdown.vbs
Dim ws Dim strProgram Dim lockFile Dim waitMilSec lockFile = "lock.txt" waitMilSec = 300000 'initialize Set ws = Wscript.CreateObject("Wscript.Shell") Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") strProgram = """C:\WINDOWS\system32\SHUTDOWN.EXE""" 'Create the lock file If objFSO.FileExists(lockFile) Then 'objFSO.DeleteFile(lockFile) Else objFSO.CreateTextFile(lockFile) End If 'Now we wait before shutdown WScript.Sleep waitMilSec 'If the lock file still exists If objFSO.FileExists(lockFile) Then 'Do whatever needed before shutdow ws(strProgram & " -s -t 0") Else 'aborted End If
abort.vbs
Dim lockFile lockFile = "lock.txt" 'initialize Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") 'Delete the lock file If objFSO.FileExists(lockFile) Then objFSO.DeleteFile(lockFile) End If
スクリプトとしては、UPS運転に切り替わるとshutdown.vbsが実行され「lock.txt」を作成する。5分後に再度「lock.txt」が存在するか確認して、存在する場合はシャットダウンを行う。
UPSから通常電源に戻ると「lock.txt」を削除する。これでshutdown.vbsが実行されていても「lock.txt」が存在しないのでシャットダウンはされない。
次にタスクの登録。
タスクスケジューラで「タスクの作成」を行う。
トリガを新規作成し「タスクの開始」プルダウンから「イベント時」を選択する。
設定で下記のように設定を行う
ログ:アプリケーション ソース:APC UPS Service イベントID:174
これで上記shutdown.vbsを登録すればOK。同じようにabort.vbsも登録するが、こちらは下記のような条件で登録する
ログ:アプリケーション ソース:APC UPS Service イベントID:61455
UPSのコンセントを抜いたときに「lock.txt」が作成されれば動く。