Powershell start-job, wait- задание, поток хоста никогда не завершается при запуске из ASP.NET IIS

В настоящее время я пытаюсь создать поточный скрипт очистки с помощью PowerShell, инициированный из IIS. Я создал многопоточную «Kill process by owner» с помощью удаленного взаимодействия PowerShell, работающую с того же списка серверов, что и мой скрипт очистки, и это работает без проблем.

$jobs = @()
foreach ($comp in $comps) {
    $jobs += start-job -FilePath ("CleanupJob.ps1") -ArgumentList $comp, $username
    Write-Host "Started Job on: $comp"
}
foreach($job in $jobs)
{
    $job | wait-job | out-null
    receive-job $job.ID
}

Remove-Job -State Completed 

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

Не так, когда я запускаю его из своего приложения asp.net, я получаю "" Запущено задание: $ comp "" для каждого из моих 28 серверов, но только результат с первых 14 и тогда ведущий поток просто сидит там. (пока я не убью его огнем, и мои результаты будут возвращены на веб-страницу asp.net)

У меня нет возможности увидеть, что происходит в сценарии, когда я запускаю его со страницы asp.net. Все, что я вижу, это Использование ЦП / ОЗУ падает до тех же уровней, что и при запуске из консоли PS, но мой основной поток никогда не закрывается. Так что я верю, что сценарий работает так, как предполагалось, но моя веб-страница зависает до тех пор, пока основной поток не закроется (чего никогда не происходит, как указано).


Я так называю свой сценарий (а не красивый способ .net <3 powershell: )

public string RunProgramme(string scriptpath, string arguments)
{
    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.FileName = @"powershell.exe";
    startInfo.Arguments = "& \'"+scriptpath+"\' "+ arguments;

    //return startInfo.Arguments;
    startInfo.RedirectStandardOutput = true;
    startInfo.RedirectStandardError = true;
    startInfo.UseShellExecute = false;
    startInfo.CreateNoWindow = true;
    Process process = new Process();
    process.StartInfo = startInfo;
    process.Start();

    string output = process.StandardOutput.ReadToEnd();
    string errors = process.StandardError.ReadToEnd();
    return output;
}

Тайна становится все глубже, добавлена ​​эта строка в мои многопоточные задания

Invoke-Command -Session $session  -ScriptBlock {param($path) net send mymachine $path}  -Args $msg 

И когда я запускаю свой скрипт из IIS, я получаю сообщение от каждой машины. Как показывает мое использование оперативной памяти, все задания выполняются, но вывод не возвращается должным образом, и мой хост-поток просто сидит там ... ждет ...

5
задан Kev 11 July 2011 в 11:26
поделиться