本シリーズのトップページ |
---|
https://qiita.com/robozushi10/items/0b0605257ad39bc22895 |
はじめに
ある PowerShell スクリプトから、マルチプロセス (== バックグラウンド) で 2つの PowerShell スクリプトを並列実行させたときの実装を書き残しておく.
図や Bashスクリプト にすると次である.
ここでは並列実行される「Sub1」と「Sub2」の呼び出し処理についてである.
なお、呼び出し元である「Main」における「Sub1」と「Sub2」の終了待ちコードについては記載しない.
シーケンス図
Bashコード
./sub1.ps1 引数 &
$PID1=$!
./sub2.ps1 引数 &
$PID2=$!
wait $PID1 $PID2
実装
前提条件
ここでは次のようにする.
・プロセス「Sub1」に該当するコードを「sub1.ps1」とする
・プロセス「Sub2」に該当するコードを「sub1.ps2」とする
1. 「Main」から「Sub1」を別プロセスとして呼び出す
「Sub1」の引数として、作業ディレクトリ($W)のパスを渡す
# 「Sub1」に引数 $W を渡して別プロセスとして実行する.
$W = 'C:\work'
# Start-Process が別プロセスでの呼び出しとなる. Bash での「&」に該当する
$CLI1 = "Start-Process powershell -ArgumentList .\sub1.ps1, {0}" -f $W
# Bash での eval $CLI1 である. 今回は戻り値を受け取るようにした
$local:RET1 = Invoke-Expression $CLI1
2. 「Main」から「Sub2」を別プロセスとして呼び出す
「Sub2」の引数として、作業ディレクトリ($W)のパスを渡す
# 「Sub2」に引数 $W を渡して別プロセスとして実行する.
$W = 'C:\work'
# Start-Process が別プロセスでの呼び出しとなる. Bash での「&」に該当する
$CLI2 = "Start-Process powershell -ArgumentList .\sub2.ps1, {0}" -f $W
# Bash での eval $CLI2 である. 今回は戻り値を受け取るようにした
$local:RET2 = Invoke-Expression $CLI2
3. 「Main」で「Sub1」と「Sub2」の終了を待つ
このときは次のような実装をした
・「Sub1」および「Sub2」は、ジョブが終了したら Git リポジトリに結果を Push する.
・「Main」は 同 Git リポジトリを一定周期で監視する
・「Main」は待機時間の上限に逹したら、「Sub1」「Sub2」を強制停止させる
・「Main」では、「Sub1」「Sub2」が発生させた例外を捕捉するようにしている
コード全文
# 「Sub1」に引数 $W を渡して別プロセスとして実行する.
$W = 'C:\work'
# Start-Process が別プロセスでの呼び出しとなる. Bash での「&」に該当する
$CLI1 = "Start-Process powershell -ArgumentList .\sub1.ps1, {0}" -f $W
# Bash での eval $CLI1 である. 今回は戻り値を受け取るようにした
$local:RET1 = Invoke-Expression $CLI1
# 「Sub2」に引数 $W を渡して別プロセスとして実行する.
$W = 'C:\work'
# Start-Process が別プロセスでの呼び出しとなる. Bash での「&」に該当する
$CLI2 = "Start-Process powershell -ArgumentList .\sub2.ps1, {0}" -f $W
# Bash での eval $CLI2 である. 今回は戻り値を受け取るようにした
$local:RET2 = Invoke-Expression $CLI2
## 3. 「Main」で「Sub1」と「Sub2」の終了を待つ
<#
・「Sub1」および「Sub2」は、ジョブが終了したら Git リポジトリに結果を Push する.
・「Main」は 同 Git リポジトリを一定周期で監視する
・「Main」は待機時間の上限に逹したら、「Sub1」「Sub2」を強制停止させる
・「Main」では、「Sub1」「Sub2」が発生させた例外を捕捉するようにしている
#>