社内で開発された一連のサービスを頻繁に再起動するバッチ ファイルがあります。近々、これらからより安定したものに移行する予定ですが、当面は、サービスが適切に機能するためには、かなり頻繁に再起動する必要があります。
これを簡素化するために、スケジュールに従って実行されるバッチ ファイルを用意しました。次のようになります。
@ECHO OFF
SETLOCAL EnableDelayedExpansion
ECHO ---------------------------------------------->> log.txt
ECHO -----------========================----------->> log.txt
ECHO -----------=========%date%=========----------->> log.txt
ECHO -----------========================----------->> log.txt
ECHO ---------------------------------------------->> log.txt
set DD=0
Set TIMESTAMP="eol=; tokens=1,2,3,4* delims=/, "
For /F %TIMESTAMP% %%i in ('DATE /t') DO (
SET YYYYMMDD=%%l%%j%%k
SET YYYYMM=%%l%%j
set DD=%%k
)
echo A >> ServiceNames
echo B >> ServiceNames
echo C >> ServiceNames
echo D >> ServiceNames
echo E >> ServiceNames
echo F >> ServiceNames
for /f %%a in (ServiceNames) do (
set timestamp=!date!!time!
ECHO !timestamp! - Stopping Service %%a >> log.txt
net stop /y srvService_%%a >> log.txt
taskkill /f /im Service_%%a.exe >> log.txt
ping localhost -n 15 > nul
set timestamp=!date!!time!
ECHO !timestamp! - Starting Service %%a >> log.txt
net start srvService_%%a >> log.txt
)
if exist ServiceNames del ServiceNames
問題は、バッチ ファイルが、あるサービスの起動が完全に完了するまで待たずに、次のサービスを停止してしまうことが何度かあることです。
net start コマンドの後に ping localhost コマンドを追加すると役立つと思いますか?
答え1
次のようなコードを使用して、サービスが完了するまで待機することができます(この場合は、w32タイム) が開始されます:
:WAIT
timeout /t 5 > NUL
for /f "tokens=4" %%s in ('sc query w32time ^| find "STATE"') do if NOT "%%s"=="RUNNING" goto WAIT
echo Service is now running!
答え2
停止時にクリーンアップが行われず、独自のプロセスで実行されている場合は、プロセスを強制終了します。
Ping
ちょっと寝るには正しい方法ではありません。ネットワークに負荷がかかります。3 つの選択肢があります。すべてに、さまざまな表示/非表示オプションがあります。
timeout /t 5
または
choice /d y /t 5
または
waitfor /t 5 FredToMarryGinger
答え3
net start は、サービスが開始を完了するまで待機してから戻ります。そのため、サービスが開始を完了する前にバッチ ファイルが先に進んだ場合、サービスは開始していないのに開始したと誤って報告したり、時間がかかりすぎてコマンドがタイムアウトしたりすることが問題となります。
理想的には、サービスが起動を完了するまで、起動が完了したことを報告しないように修正する必要があります。また、サービスが起動が完了したことを示す状態ファイルなどを出力し、バッチ ファイルがそれが表示されるまで待機してから次に進むようにすることもできます。または、タイムアウトが問題である場合は、サービスの状態が「実行中」と表示されるまで、「net start」または「sc query」を使用して継続的に再確認するループを作成することもできます。
[編集] カランが言ったこと。