Scriptblock работает как Invoke-Command, но не как Start-Job
Я написал ScriptBlock, который загружает файл POST на пользовательский http-сервер и сохраняет ответ на диск. Он предназначен для тестирования указанного сервера и в дополнение к проверке правильного ответа. Я хотел бы запустить его параллельно для загрузки сервера.
Код в ScriptBlock был построен как отдельный скрипт ps1 и работает. Затем я перевёл его в framework-скрипт, используя 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
констатировать навсегда.
Что может вызвать это поведение? Что можно использовать для его отладки? Если есть какая-то ошибка, могу ли я заставить детскую работу завершиться и сказать мне, что ей не нравится?
Я использую PowerShell 2.0 на Windows XP.
В рамках, которые я придумал, я делаю Start-Job
(в настоящее время только один из них, но я планирую увеличить это число для стресс-тестирования). Тогда у меня есть цикл, ожидающий их завершения:
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, он будет работать.
Спасибо.
1 ответ
Когда вы запускаете Get-Job, имеет ли свойство задания "HasMoreData" значение "True"?
Если да, проверьте вывод задания:
Receive-Job <JobName or JobID> -Keep