Windows上で動いているApacheなどのサービスを、バッチファイルを使って再起動する方法。
SC.exeを使って再起動しようとすると上手くいかない。
set service_name=Apache2結果:
sc stop %service_name%
sc start %service_name%
C:>set service_name=Apache2この結果ではわかり辛いが、SC.exeは処理をフォークして非同期で進めるため、サービスのSTOPが完了する前に処理が戻ってきてしまう。
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:
サービス インスタンスは既に実行されています。
そのため、STOPが完了する前にSTARTを実行してしまい、その結果STARTに失敗している。
どうすればよいか?
昔ながらのNETコマンドを使えばよい。
set service_name=Apache2結果:
net stop %service_name%
net start %service_name%
C:>set service_name=Apache2NETコマンドはコマンドの完了まで処理が戻ってこないので、このようなケースでは便利だ。
C:>net stop Apache2
Apache2 サービスを停止中です.
Apache2 サービスは正常に停止されました。
C:>net start Apache2
Apache2 サービスを開始します..
Apache2 サービスは正常に開始されました。
(待たされたくない場合には不便だが。)
これでタスクに登録して定期的に再起動できる。
SC.exeを使ってApacheを再起動するためにPHPでプログラムを組んでからこれに気付いたことは、内緒だよ。
2 件のコメント:
私もコードの確実な入れ替えのために net stop , copy, net start という手段を講じていたのですが、net stop で固まってしまうことがあるので、pskill を使ってプロセスを殺すことにしました。安全性0ですが。
コメントありがとうございます。
そういう手もあるんですね。
自分もとりあえずこんな手を使ってますが、確実にstop, startをしなければいけないようなケースではリトライなどを組み込んだプログラムを書くことになると思います...。
コメントを投稿