ハムスターに飼われる院生のブログ

自分用メモが中心のブログです。

cpuの空きを確認してから処理を行うbatファイル

test.exe がコマンドライン引数 1 2 3 4 5 を取るとする。
この実行ファイルを最大で100回繰り返したいときに、
cpuの空きを確認して空きがあれば実行、空きがなければ600秒待機するバッチファイルを作成した。
今回はcpuが小数点切り捨て70%以下の使用率で実行とした。
cpuの使用率を確認する部分は64bit用のものなので

typeperf -sc 1  -si 1 "\processor(_Total)\%% Processor Time" | find ":" >cpu.csv

だが、32bitの場合は

typeperf -sc 1  -si 1 "\processor(_Total)\% Processor Time" | find ":" >cpu.csv

と変更する必要がある。

なお、test.exeのコマンドライン引数は文字列として扱っているため、
実際は小数を入れることも可能。
このように実行する。

testbat.bat test.exe 100 1 2 3 4 5

呼び出し先のtestbat.batは以下の通り。

@echo off
@setlocal enabledelayedexpansion

set exefile=%1
set /a loop_max=%2
set arg1=%3
set arg2=%4
set arg3=%5
set arg4=%6
set arg5=%7
set /a counter=1
for /l %%i in (0,1,1000000) do (
	call :Check_Termination
	typeperf -sc 1  -si 1 "\processor(_Total)\%% Processor Time" | find ":" >cpu.csv
	powershell sleep 1
	call :Check_CPU
	call :RunCalc
)
pause
exit /b


:Check_Termination
	if %counter% gtr %loop_max% (
		exit
	) else (
	)
	exit /b

:Check_CPU
	for /f "tokens=1-5 delims=," %%a in (cpu.csv) do (
		set v=%%~b
	)
	call :GetINT
	call :CheckVacancy
	exit /b
	
:RunCalc
	rem echo vacancy=%vacancy%
	if %vacancy%==1 (
			set /a counter=counter+1
			rem echo %counter%
			echo 計算%counter%を実行中
			start	%exefile%	%counter%	%arg1%	%arg2%	%arg3%	%arg4%	%arg5%	>	output%counter%.txt
		) else (
			echo cpuの空きに余裕がないので計算実行を待機しています
			powershell sleep 600
		)
	exit /b

:GetINT
	for /f "tokens=1* delims=." %%a in ("!v!") do (
		set /a cpu=%%~a
	)
	exit /b

:CheckVacancy
	echo cpu=%cpu% %%の使用率
 	if %cpu% lss 70 (
 		set /a vacancy=1
 	) else (
 		set /a vacancy=0
 	)
	exit /b

:fin
exit /b

cpuの使用率を一度cpu.csvに書き出している。