2013年11月02日

Windows Server 2008のタスクスケジューラをこねくりまわす

こんなアホなことを真剣に考えているサーバ運用者も俺くらいじゃないかと思ったので記念にメモっておきます。

■前提
Windowsのタスクスケジューラってのは、
「いついつにこれ実行しろよ」
っていうやつです。

で、サーバ運用っていろいろあるので、これを駆使して戦います。
特にAWSのようなクラウド環境だと、シャットダウンしておかないとお金が取られるので、
できるだけシャットダウンしておきたいんです。
シャットダウンはサーバ内部からやらないと、
AWSのStopコマンドだとサービスの停止などが不完全になる可能性が高く、
よってサーバ内部からのタスクスケジューラを利用してのシャットダウンが一番安全ではあります。

■シャットダウンスケジュールを2つ用意する効率の良いイレギュラー対応
例えば、毎日24時にシャットダウンしているサーバがあります。
このサーバの利用者から「毎週金曜日だけは21時停止で良い」と言われたとします。

さて、このときは、既存のタスクスケジューラにある
A)毎日24時にサーバをシャットダウンするスケジュール
を編集する必要はありません。ここに、
B)毎週金曜日は21時にサーバをシャットダウンするスケジュール
を追加すれば、上の通りになります。

というのも、Bのタスクが実行された後にAが実行されたとしても、
既にサーバはシャットダウンされているので問題ないのです。

では反対に、毎日24時にシャットダウンしているサーバがあり
このサーバの利用者から「毎週金曜日だけは25時停止が良い」と言われたとします。

うーむ。ならどうしようか?この場合は、
C)毎日1時(25時)にサーバをシャットダウンするスケジュール
D)毎週金曜日"以外"は24時にサーバをシャットダウンするスケジュール
という設定が可能なので、これでいけます!

■毎月の最終金曜日だけなんとかしてくれの場合
これは、もう少し複雑です。上の例を引き続き使うと、
例えば、毎日24時にシャットダウンしているサーバがあります。
このサーバの利用者から「毎週金曜日だけは21時停止で良い」と言われたとします。
に加えて、「"毎月最終週"の金曜日だけは18時停止で良い」と言われたとします。

さてどう設定しましょうか。クイズですね、もう。

このときは、既存のタスクスケジューラにある
A)毎日24時にサーバをシャットダウンするスケジュール
はもちろん生かしておいて、
B)毎週金曜日は21時にサーバをシャットダウンするスケジュール
ももちろん生かしておきます。そこに加えて
E)毎月の最終金曜日は18時にサーバをシャットダウンするスケジュール
を加えればOKです。

20131102-33550.jpg

うん、実はこんな設定までできるんだよねえ。
がしかし、これでも難しいのが以下のパターン。

例えば、毎日24時にシャットダウンしているサーバがあります。
このサーバの利用者から「毎週金曜日だけは21時停止で良い」と言われたとします。
に加えて、「"毎月最終週"の金曜日だけは25時停止が良い」と言われたとします。

いやいやいやいや・・・考えてみましょう。

A)毎日24時にサーバをシャットダウンするスケジュール
はもちろん生かしておいて、
B)毎週金曜日は21時にサーバをシャットダウンするスケジュール
ここまではOK。当たり前だ。

で、さらに・・・ここに何を加えたらいいんだ?

F)毎月の最終土曜日は1時(これで金曜25時)にサーバをシャットダウンするスケジュール

を加えても駄目。
だって「B」において、金曜日の21時にシャットダウンされてしまってるのです。
Aでも24時に落とされてしまうので・・・あーあーあー

うーん。考えた結果・・・

G)毎週金曜日"以外"(つまりは毎週の日月火水木土)は24時にサーバをシャットダウンするスケジュール
これで金曜日以外はOK。残りは金曜日の話。
で、金曜日は場合わけすると、

◎第5週まである場合
第1金曜日:21時
第2金曜日:21時
第3金曜日:21時
第4金曜日:21時
第5金曜日:25時

◎第4週までしかない場合
第1金曜日:21時
第2金曜日:21時
第3金曜日:21時
第4金曜日:25時

のどちらかのパターンしかない!ってわけで、不完全だけども
G)毎週金曜日"以外"(つまりは毎週の日月火水木土)は24時にサーバをシャットダウンするスケジュール
に加えて
H)毎週土曜日の1時(金曜日の25時)にサーバをシャットダウンするスケジュール
を設定。これで
「月末じゃない毎週金曜日の21時から25時までは不要なお金がかかるけど運用はまわるしOK」
なところまで持ってこれました。

さて、ここに
I)毎月の第1,2,3の金曜日は21時にサーバをシャットダウンするスケジュール
を追加します。
そうすると、「◎第4週までしかない場合」パターンでは問題ない運用になって、
「◎第5週まである場合」では第4週目だけが21時から25時まで少々無駄になる、というだけで済みます。
なお、「I」に第4まで加えたら「◎第4週までしかない場合」パターンでアウトになるので
これではいけませんね。運用が回らないのは駄目なんです、はい。

もうこれでいいじゃん!!

・・・

駄目です。
すんげーだるいんですけど、ちゃんとできる方法があります。

まずは
G)毎週金曜日"以外"(つまりは毎週の日月火水木土)は24時にサーバをシャットダウンするスケジュール
は同じ。で、
B)毎週金曜日は21時にサーバをシャットダウンするスケジュール
を作ります。うん。で、
F)毎月の最終土曜日は1時(これで金曜25時)にサーバをシャットダウンするスケジュール
を加えます。

ここまで見るとはい、変ですね。変です。
だって「F」の意味が一切ない!ですからね。
しかし・・・しかし、ここに

・【B-】これはタスク「B」を無効化する外部バッチです
・【B+】これはタスク「B」を有効化する外部バッチです
に加えて、
K)毎月の最終金曜日は20:55に「B-」を呼び出して実行する
L)毎月の最終金曜日は21:05に「B+」を呼び出して実行する

というスケジュールを組んであげれば・・・
B)毎週金曜日は21時にサーバをシャットダウンするスケジュール
が毎月の最終金曜日にだけはこれが「無効」になってくれ、
しかもその後に復活させられ、もちろん過ぎ去った過去は実行されず
次の実行日にまわされるので問題なし。

このように、
G),B),F),B-,B+,K),L)
という組み合わせにより、これが可能になることが
論理上可能ということが証明されました!!!!!

だりいいいいい!!!!!!!wwww

つまり、
「Windowsタスクスケジューラではシャットダウンを後に伸ばすのは難しい」
ということが、改めてわかりました。
posted by hinata_hisa at 04:11 | 東京 ☁ | Comment(0) | IT関係 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。