5 つのスクリプトを一緒にパイプライン処理するスクリプトの 15 のインスタンスを実行したいのですが、これまでのところ、ピクシー ダストが不足しています。この問題を、スレーブ スクリプトを呼び出すマスター スクリプトを使用したテスト ケースにまとめました。スレーブ スクリプトは、次に sub_slave スクリプトを呼び出します (失敗を再現するためにパイプラインは必要ありません)。
master.ps1 が slave.ps1 を呼び出すと、各バックグラウンド ジョブは、slave.ps1 が sub_slave.ps1 を呼び出す時点で無期限にハングします。slave.ps1 の呼び出しを sub_slave.ps1 にコメント アウトすると、master.ps1 が最後まで実行されます。また、slave.ps1 を直接起動すると、sub_slave.ps1 への呼び出しが正常に実行されます。ダブルチェーンを試してみると、問題は扱いにくいようです。これらのスクリプトを任意の深さを超えてデイジーチェーン接続できないというドキュメントは見たことがありませんが、十分に深く読んでいないのではないでしょうか?
簡単なテキスト ファイルにコンテンツを追加することで、スクリプトの進行状況を追跡していることがわかります。
d:\ジョブ\master.ps1
$indexes = @(0,1,2)
$initString = "cd $pwd"
$initCmd = [scriptblock]::create($initString)
set-content -path out.txt -value "Master started"
foreach ($index in $indexes)
{
add-content -path out.txt -value "job starting"
start-job -filepath slave.ps1 -InitializationScript $initCmd -ArgumentList @("master index $index originated")
}
add-content -path out.txt -value "master completed"
d:\ジョブ\スレーブ.ps1
#requires -version 2.0
param (
[parameter(Mandatory=$false)]
[string]$message = "slave_originated"
)
begin
{
Set-StrictMode -version Latest
add-content -path out.txt -value "slave beginning in $pwd"
}
process
{
add-content -path out.txt -value "slave processing $message"
invoke-expression "D:\jobs\sub_slave.ps1 -message $message"
}
end
{
add-content -path out.txt -value "slave ending"
}
d:\jobs\sub_slave.ps1 #必要 -version 2.0
param (
[parameter(Mandatory=$false)]
[string]$message = "sub_slave originated"
)
begin
{
Set-StrictMode -version Latest
add-content -path out.txt -value "sub_slave beginning"
}
process
{
add-content -path out.txt -value "sub_slave processing $message"
}
end
{
add-content -path out.txt -value "sub_slave ending"
}
何もコメントアウトせずにコードを実行すると、out.txt に次のように表示されます: d:\jobs\out.txt
Master started
job starting
job starting
job starting
master completed
slave beginning in D:\jobs
slave processing master index 0 originated
slave beginning in D:\jobs
slave processing master index 1 originated
slave beginning in D:\jobs
slave processing master index 2 originated
各別れメッセージの直後のコマンドは sub_slave.ps1 の呼び出しであり、sub_slave.ps1 からのメッセージはまったく表示されないことに注意してください。システムは、3 つの powershell.exe プロセスが永久に正常に実行された状態でハングします。Get-job は、3 つのプロセスがまだ実行中であり、HasMoreData であることを報告します。
私が得た唯一の手がかりは、ハングしたプロセスをクラッシュダンプすると、次のように表示されることです。
Number of exceptions of this type: 2
Exception MethodTable: 79330e98
Exception object: 012610fc
Exception type: System.Threading.ThreadAbortException
Message: <none>
InnerException: <none>
StackTrace (generated):
<none>
StackTraceString: <none>
HResult: 80131530
-----------------
Number of exceptions of this type: 2
Exception MethodTable: 20868118
Exception object: 01870344
Exception type: System.Management.Automation.ParameterBindingException
Message: System error.
InnerException: <none>
StackTrace (generated):
<none>
StackTraceString: <none>
HResult: 80131501
-----------------
おそらく、ある種のパラメーターの問題が発生していますか?sub_slave.ps1 からすべてのパラメーターを削除しても動作は変わらないので、それはちょっと疑問ですが、可能です。私はどんな考えにもオープンです。