2

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 からすべてのパラメーターを削除しても動作は変わらないので、それはちょっと疑問ですが、可能です。私はどんな考えにもオープンです。

4

2 に答える 2

3

sub_slave.ps1 を間違って呼び出しています。これ:

invoke-expression "D:\jobs\sub_slave.ps1 -message $message" 

これでなければなりません:

D:\jobs\sub_slave.ps1 -message $message

メッセージが評価され、複数の引数になりました。

于 2011-03-04T00:29:02.190 に答える
0

ここで推測するだけですが、複数のスレッド/ジョブが同じファイルに書き込むとout.txt問題が発生する可能性があります。

于 2011-03-04T00:17:02.550 に答える