Ограниченные стартовые задания PowerShell

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

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


Наблюдая за процессами, каждый из них потребляет около 25 МБ памяти и бездействует... Если я убью один из них, остальные 3 начнут использовать cpu, и процесс займет около 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]... но все три метода используют Джобс... так что, похоже... я не могу запустить больше, чем три начала работы одновременно.

1 ответ

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

Другие вопросы по тегам