1

ファイルのアップロードをカスタム http サーバーに POST し、応答をディスクに保存する ScriptBlock を作成しました。上記のサーバーをテストするために使用することを目的としており、正しい応答を確認することに加えて、サーバーをロードするために並行して実行したいと考えています。

ScriptBlock のコードは、別の ps1 スクリプトとしてビルドされ、動作します。Start-Job次に、ジョブを管理し、最終的に全体的な結果を提示するために使用するフレームワーク スクリプトに移植しました。

残念ながら、その移植後は機能しません。

症状はStart-Job、ジョブの使用が終了しないことです。テストのために、に切り替えましたInvoke-Command。単純なInvoke-Command作品でInvokeCommand -AsJobはありません。

作品:

Invoke-Command -Scriptblock $ScriptBlock -ArgumentList $Name,"C:\Projects\DCA\CCIT\ServiceBroker4\Java\eclipse-workspace\XFAWorker\testdata","P7-T"

動作しない:

Invoke-Command -AsJob -Computer localhost -Scriptblock $ScriptBlock -ArgumentList $Name,"C:\Projects\DCA\CCIT\ServiceBroker4\Java\eclipse-workspace\XFAWorker\testdata","P7-T"
Start-Job -Name $Name -ScriptBlock $Scriptblock -ArgumentList $Name,"C:\Projects\DCA\CCIT\ServiceBroker4\Java\eclipse-workspace\XFAWorker\testdata","P7-T"

使用されている ScriptBlock はかなり長めです。パラメータを宣言することから始めます。

$Scriptblock = {
    Param (
        [string]$JobName,
        [string]$path,
        [string]$BASEJOBNAME
    )

さらに下では、HttpWebRequest と他のいくつかの .NET クラスを使用しています。

$url = "http://localhost:8081/fillandflatten"
[System.Net.HttpWebRequest] $req = [System.Net.WebRequest]::create($url)
...
$xfabuffer = [System.IO.File]::ReadAllBytes("$path\$BASEJOBNAME.xml")
...
$header = "--$boundary`r`nContent-Disposition: form-data; name=`"xfa`"; filename=`"xfa`"`r`nContent-Type: text/xml`r`n`r`n"
$buffer = [Text.Encoding]::ascii.getbytes($header)        
...
[System.Net.httpWebResponse] $res = $req.getResponse()

使用時に説明されているように、Start-Jobまたは子Invoke-Command -AsJobジョブが開始されたときは、単純にそのRunning状態が永久に残ります。

この動作の原因は何ですか? それをデバッグするために何を使用できますか? エラーが発生した場合、子ジョブを強制的に終了させて​​、何が気に入らないかを教えてもらえますか?

Windows XP で PowerShell 2.0 を使用しています。

私が思いついたフレームワークでは、Start-Job(現在はそのうちの 1 つにすぎませんが、ストレス テストのためにその数を増やす予定です)。次に、それらすべてが終了するのを待っているループがあります。

do {
    $Jobs = @(Get-Job | Where { $_.State -eq "Running" -and $_.Name.StartsWith($BASEJOBNAME) }); 
    $n = $Jobs.Count
    if ($n -gt 0)
    {
        Log -message "Waiting for $n jobs to finish..."    
        Get-Job | Where { $_.Name.StartsWith($BASEJOBNAME) } | Format-Table -AutoSize -Property Id,Name,State,HasMoreData,Location

        start-Sleep -Seconds 3
    }
} until ($n -eq 0) 

これにより、次の形式の出力が生成されます。

2014-08-01 18:58:52 - Waiting for 1 jobs to finish...

Id Name     State HasMoreData Location
-- ----     ----- ----------- --------
2 XFA001 Running        True localhost

永遠に。

完全な最小テスト ケースは次のとおりです。

# Code for the Jobs:
$Scriptblock = {
    [System.Net.HttpWebRequest] $req = [System.Net.WebRequest]::create("http://locahost/index.html")        
    return "done"       
}

# Start a job. Three variants, The Job-based ones hang.

# Invoke-Command -Scriptblock $ScriptBlock
#Invoke-Command -AsJob -Computer localhost -Scriptblock $ScriptBlock
$Job = Start-Job -Name $Name -ScriptBlock $Scriptblock

## The rest of the code is only applicable for the Start-Job-Variant

# Wait for all Jobs to finish
do {
    $Jobs = @(Get-Job | Where { $_.State -eq "Running" }); 
    $n = $Jobs.Count
    if ($n -gt 0)
    {
        Write-Host "Waiting for $n jobs to finish..."    
        Get-Job | Format-Table -AutoSize -Property Id,Name,State,HasMoreData
        Start-Sleep -Seconds 3
    }
} until ($n -eq 0) 

# Get output from all jobs
$Data = ForEach ($Job in (@(Get-Job | Where { $_.Name.StartsWith($BASEJOBNAME) } ))) {  
    Receive-Job $Job
}

# Clean out all jobs
ForEach ($Job in (@(Get-Job | Where { $_.Name.StartsWith($BASEJOBNAME) } ))) {  
    Remove-Job $Job
}

# Dump output
Write-Host "Output data:"
$Data | Format-Table
Write-Host ""

これは私のためにハングアップします。WebRequest オブジェクトを作成する行をコメントアウトすると、機能します。

ありがとうございました。

4

1 に答える 1

0

Get-Job を実行すると、ジョブの「HasMoreData」プロパティは「True」になりますか?

はいの場合は、ジョブの出力を確認します。

Receive-Job <JobName or JobID> -Keep
于 2014-08-01T16:15:28.710 に答える