メンチカツには醤油でしょ!!

AWS/Java/Node.js/Spreadsheets/Docker/Jenkins/コミュニティ・勉強会レポを主とした技術系ブログ

Windows cmdでsc.exeのstopとstartを組み合わせてサービスのrestart

サービスを操作するには net か sc コマンド

Windowsサービスの開始・終了をコマンドで行う場合にはnetコマンドかscコマンドを使います。これらの違いとしてそれぞれ下記のような違いあります。

・netコマンドは同期的
・scコマンドは非同期的

つまり、netコマンドは実行終了まで待つが、scコマンドは待たない。

・netコマンドはリモートのサービスは操作できない
・scコマンドはリモートOK

scでリモートのサービスを再起動(restart)したい

Jenkinsなど、別マシンからWindowsサービスを操作したいことがあると思います。
前述のとおり、リモートのサービスの場合scコマンドを使います。

ただ、scコマンドにはstartとstopしかなく
sc stop ServiceName
sc start ServiceName
と実行しても、scが非同期なので、stop処理が完全に終了する前に次のコマンド実行に流れてしまい、sc startコマンドの実行時点ではサービスが終了しきっていないというエラーになります。

sc stopを同期的に同期的に使用するためには、下記のように do-while ループを回し、その中で query の結果が STOPPED になるのを待ちます。

sc \\【IPアドレス stop 【サービス名】

:DoWhile
	sc sc \\【IPアドレス query 【サービス名】 | findstr STATE | findstr STOPPED
	if %ERRORLEVEL% EQU 0 goto DoWhileExit
goto DoWhile
:DoWhileExit

sc \\【IPアドレス start 【サービス名】

cmd不便です。。
これでとりあえずしのぎました。

参考

7. バッチ処理とフローチャート
http://mapplio.info/flo/flo_lecture2/bat_charpter.html#do-while

neos21.hatenablog.com

tipstour.net