Ограниченное количество запусков Powershell

Мне любопытно, можете ли вы ответить на этот вопрос или указать мне правильное направление.

Я написал сценарий, который проверяет / отслеживает URL-адреса. Я не публикую код (если вы этого не хотите), потому что в коде нет ошибки. Отлично работает. Я даже могу запустить скриптблок как часть стартового задания. У меня проблема, похоже, в том, что я не могу запускать более 3 заданий за раз .. или они зависают. Я не уверен, почему это так. Я могу запустить его с 15 URL-адресами, доведенными до 3, и это здорово. Если я попытаюсь запустить его на 15 URL с 4 в качестве моего лимита запуска, они будут зависать .. и я могу убить по одному за раз .. пока не останется только 3, и они закончатся. Так что кажется, что я могу запустить только 3 экземпляра PowerShell, иначе они зависнут. Кто-нибудь объяснит, почему это так? Все мои поиски приводят меня к страницам, которые показывают, как задросселировать, и это не моя проблема.


Наблюдая за процессами, каждый из них потребляет около 25 МБ памяти и бездействует ... Если я убью одного, остальные 3 начнут использовать процессор, процесс увеличится до 30 МБ памяти и завершится. Система имеет 8 ГБ памяти и четырехъядерный процессор I5-2400 @ 3,10 ГГц. Как просили...

Param(
$file
)
$testscript =
{
Param(
[string]$url,
#[ValidateSet('InternetExplorer','Chrome','Firefox','Safari','Opera', IgnoreCase = $true)]
[string]$browser="InternetExplorer",
[string]$teststring="Solution Center",
[int]$timeout=20,
[int]$retry
)
$i=0
do {
$userAgent = [Microsoft.PowerShell.Commands.PSUserAgent]::$browser
$data = Invoke-WebRequest $url -UserAgent $userAgent -TimeoutSec $timeout
$data.Content
$findit = $data.Content.Contains($teststring)
$i++
If ($findit){
break
}
}
while ($i -lt $retry)

if(!$findit) {
Echo "opcmsg a=PSURLCheck o=NHTSA msg_t='$teststring was not found on $url or $url failed to load'"

}
}
$urls = Import-Csv $file | % {

Start-Job -ScriptBlock $testscript -ArgumentList $_.url, $_.browser, $_.teststring, $_.retry

}
While (@(Get-Job | Where { $_.State -eq "Running" }).Count -ne 0)
{  Write-Host "Processing URLs..."
   Get-Job
   Start-Sleep -Seconds 5
}
$Data = ForEach ($Job in (Get-Job)) {
   Receive-Job $Job
   Remove-Job $Job
}
$data | select *

Итак, я использовал новый system.net.webclient и даже пытался сделать это с помощью [System.Collections.Queue] ... но все три метода используют Jobs ... так что похоже ... Я не могу запустить больше, чем три начальных задания одновременно.


person Daniel Peel    schedule 20.11.2014    source источник


Ответы (1)


Вы уверены, что ваш код в порядке? Если вы вызываете отдельные сеансы PowerShell несколько раз, память может быть израсходована очень быстро. Проверьте монитор процессов на предмет высокой загрузки ЦП или памяти и убедитесь, что ваши блоки завершаются. Или разместите код.

person Eric Longstreet    schedule 20.11.2014
comment
Обновлено по вашему запросу - person Daniel Peel; 21.11.2014
comment
Что вы подразумеваете под дросселированием 15 URL-адресов с 4 в качестве предела? Я не вижу в вашем коде контроля максимального количества потоков. Вы пробовали использовать другой механизм веб-запросов, например этот? stackoverflow .com / questions / 20259251 /. - person Eric Longstreet; 21.11.2014
comment
В этом случае ... Я регулирую на основе ввода ... файл $ имеет x количество URL ... итак, 4 URL-адреса, 4 процесса запускаются ... и зависают, 15 URL-адресов ... вы понимаете .. Я удалил код, который делал троттлинг, поскольку думал, что это может быть так. Предлагаемый процесс не предлагает (по крайней мере, то, что я могу найти) возможность поиска на сайте определенного текста. У меня есть еще один вариант использования New-Object Net.Webclient ... но мне нравится, как это работает ... так что, если для этой команды нет чего-то особенного, что останавливает выполнение программы более трех раз ... Я не действительно не хочу это менять. - person Daniel Peel; 22.11.2014
comment
Оказывается ... не совсем уверен, почему ... это не работает при запуске из ISE, но если я запускаю его в окне консоли ... нет проблем - person Daniel Peel; 04.12.2014