2008年3月13日木曜日

バッチファイルでWindowsのサービスを再起動する方法

Windows上で動いているApacheなどのサービスを、バッチファイルを使って再起動する方法。


SC.exeを使って再起動しようとすると上手くいかない。

set service_name=Apache2
sc stop %service_name%
sc start %service_name%
結果:
C:>set service_name=Apache2

C:>sc stop Apache2

SERVICE_NAME: Apache2
TYPE : 10 WIN32_OWN_PROCESS
STATE : 3 STOP_PENDING
(NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN))
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x3
WAIT_HINT : 0x7530

C:>sc start Apache2
[SC] StartService FAILED 1056:

サービス インスタンスは既に実行されています。
この結果ではわかり辛いが、SC.exeは処理をフォークして非同期で進めるため、サービスのSTOPが完了する前に処理が戻ってきてしまう。
そのため、STOPが完了する前にSTARTを実行してしまい、その結果STARTに失敗している。


どうすればよいか?


昔ながらのNETコマンドを使えばよい。
set service_name=Apache2
net stop %service_name%
net start %service_name%
結果:
C:>set service_name=Apache2

C:>net stop Apache2
Apache2 サービスを停止中です.
Apache2 サービスは正常に停止されました。


C:>net start Apache2
Apache2 サービスを開始します..
Apache2 サービスは正常に開始されました。
NETコマンドはコマンドの完了まで処理が戻ってこないので、このようなケースでは便利だ。
(待たされたくない場合には不便だが。)

これでタスクに登録して定期的に再起動できる。


SC.exeを使ってApacheを再起動するためにPHPでプログラムを組んでからこれに気付いたことは、内緒だよ。

2 件のコメント:

匿名 さんのコメント...

私もコードの確実な入れ替えのために net stop , copy, net start という手段を講じていたのですが、net stop で固まってしまうことがあるので、pskill を使ってプロセスを殺すことにしました。安全性0ですが。

admin さんのコメント...

コメントありがとうございます。
そういう手もあるんですね。
自分もとりあえずこんな手を使ってますが、確実にstop, startをしなければいけないようなケースではリトライなどを組み込んだプログラムを書くことになると思います...。

ブログ アーカイブ

tags