簡単な仕組みで複数台のWindowsマシンでほぼ同時に処理を実行してみた。
マシン1(host1)で処理を開始する。
> cd c:\hoge > echo > wait.lock > wait.bat wait.lock
マシン2(host2)で処理を開始する。
> cd c:\hoge > echo > wait.lock > wait.bat wait.lock
これで2つの処理が待機状態になる。
ここで、マシン1(host1)から2台のマシンのロックファイルを削除してやる。
> start "" "cmd" "/c del \\host1\c$\hoge\wait.lock" > start "" "cmd" "/c del \\host2\c$\hoge\wait.lock"
すると、マシン1(host1)で処理が終了し、
> wait.bat wait.lock >
マシン2(host2)でも処理が終了する。
> wait.bat wait.lock >
wait.bat を呼んでやる以下のようなバッチを作成すれば、複数台のマシンで「処理1」をほぼ同時に実行することができる。
call wait.bat wait.lock
処理1...
[ソースコード]
- wait.bat
@echo off rem 引数で指定されたファイルが存在する間は無限ループし、ファイルがなくなると終了する。 rem 引数が指定されなかった場合のデフォルト値は、wait.bat と同じディレクトリの wait.lock。 rem rem usage: wait.bat <ファイルパス> rem e.g : wait.bat c:\wait.lock set BASE_DIR=%~p0 set LOCK_FILE="%BASE_DIR%wait.lock" if not "%~1" == "" ( set LOCK_FILE=%1 ) :loop cscript //Nologo %BASE_DIR%sleep.vbs 1 if not exist "%LOCK_FILE%" goto end goto loop :end exit /b 0
- sleep.vbs
'引数で指定されたミリ秒数スリープする '引数が指定されなかった場合は1ミリ秒スリープする。 ' 'usage: cscript //Nologo second 'e.g : cscript //Nologo sleep.vbs '1ミリ秒スリープする ' cscript //Nologo sleep.vbs 3000 '3秒スリープする Option Explicit Dim args Set args = WSCript.Arguments Dim sec sec = 1 if args.Count >= 1 then sec = args.item(0) end if WScript.Sleep(sec)