2011年9月9日金曜日

サービス停止を待つ

どうも。
いち、プログラマのyu1rowです。

今回は小ネタです。
タスクスケジューラなんかで、以下のような事をしようとしまして
  • Apacheを終了
  • なんかゴニョゴニョ作業する
  • またApacheを起動

まず、コマンドプロンプトとかからApacheのサービスを停止するには、以下のようなコマンドを使います

> sc stop Apache2.2

起動する場合は、こう

> sc start Apache2.2

しかし、バッチファイルで連続して処理を行う場合は、sc stopコマンドはすぐ終わってしまいますが、終了処理に時間がかかるのでサービスはまだ停止していない、みたいな事になります。
これを待ちたいなぁと思いまして。

なんとかして作ったバッチファイルが、これ
@ECHO OFF
SET servicename=Apache2.2

REM ***** Apacheの停止
sc stop %servicename% > NUL

REM ***** Apacheの停止待ち
:JOIN
ping localhost -n 1 > NUL
sc stop %servicename% > NUL
SET status=%ERRORLEVEL%
IF %status%==1061 GOTO JOIN

REM ***** ゴニョゴニョなんか処理する
REM GONYOGONYO

REM ***** Apacheの開始
sc start %servicename% > NUL

※Windows 7でしか試してません
※管理者権限じゃないといけません

大事なのは、9行目と11行目。
完全に停止していないうちにもう一回sc stopすると、ERRORLEVELに1061が返ります。
そして、完全に停止していたら1062が返ります。
多分、これでうまくいくんちゃうかな?
ご利用は自己責任で☆

※追記
ERRORLEVELに返って来る1061や1062だとかいうコード、一体何か?
ADVAPI32.DLLのControlServiceが返すコードの模様。
以下1061,1062についてのみ抜粋
コード意味
ERROR_SERVICE_CANNOT_ACCEPT_CTRL(1061)サービスの状態が SERVICE_STOPPED、SERVICE_START_PENDING、SERVICE_STOP_PENDING のいずれかであるため、要求された制御コードをこのサービスへ送信できません。
ERROR_SERVICE_NOT_ACTIVE(1062)このサービスはまだ開始されていません。

詳しくはココ

2 件のコメント:

  1. ループの途中にstopを時間指定でいれたほうがよくない・・・?

    某元空手部より

    返信削除
  2. 面倒やしイヤやなぁとか思ったけど、簡単に実現できそうだから追記した!THX!

    返信削除