ablog

不器用で落着きのない技術者のメモ

複数のWindowsマシンでほぼ同時に処理を開始する

簡単な仕組みで複数台の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)