Тайм-аут сценария Powershell через 130 секунд - PullRequest
1 голос
/ 05 января 2012

У меня есть скрипт powershell, который запускает консольное .exe-приложение.Консольное приложение запускает веб-сервис.Веб-сервису требуется около 10 минут для выполнения задачи.

В производственной среде сценарий powershell завершается примерно через 130 секунд, и задача веб-службы завершается.Это основная проблема!Все отлично работает в локальной среде.

Powershell версии 2 работает как локально, так и в рабочем режиме.

При запуске сценария powershell из консоли.Локально сценарий powershell печатает возвращаемое значение консольного приложения.В производстве ничего не выводится на экран.Он просто отображает новую командную строку.

Задача может быть запущена асинхронно с веб-страницы в производственной среде.

Все файлы кода приложения / конфигурации одинаковы для обоих локальных /производственные среды.

Единственное, что имеет смысл, - это сценарий powershell, это тайм-аут и завершение консольного приложения, которое, в свою очередь, завершает работу веб-службы.скрипты.Но тот факт, что он работает локально, указывает на проблему с настройками по умолчанию для PowerShell.

На этой странице описаны параметры тайм-аута: http://www.ehow.com/how_12026004_set-timeout-powershell.html

Но запуск: Dir WSMan: \ localhost \ shell приводит кОшибка пути не найдена при запуске в рабочей среде.

Ниже приведен Powerscript, но удалена вся конфиденциальная информация.Успешное письмо отправляется после запуска скрипта.

# attempt to exe file.  iex is an alias for the invoke-expression cmd
iex "Reminder.exe"

$smtpServer = ""
$fromAddress = ""
$toAddress = ""
$subject = "SUCCESS"
$msgBody = ""

# $? lets us know if the previous command was successful or not
# $LASTEXITCODE gives us the exit code of the last Win32 exe execution
if (!$? -OR $LASTEXITCODE -gt 0)
{
$subject = "FAIL"
}

$smtpClient = new-object Net.Mail.SmtpClient($smtpServer)
$smtpClient.Credentials = $senderCreds
$smtpClient.Send($fromAddress,$toAddress,$subject,$msgBody)

1 Ответ

0 голосов
/ 07 января 2012

Я сделал неверное предположение здесь. Сценарий powershell не возвращал результаты консольного приложения. Консольное приложение не работает. Но так как скрипт вывел «0», я предположил, что он был успешным (как возвращено консольным приложением). Добавление следующей строки в скрипт powershell вернул фактическое возвращаемое значение:

Write-Host "CONSOLEEXITCODE : $LASTEXITCODE"

Теперь, когда стало ясно, что консольное приложение не работает, а не сценарий powershell (как доказано предложенным умным тестом ping), я добавил Console.WriteLine для записи ошибки (в командное окно powershell):

Тип содержимого text / html; charset = utf-8 ответного сообщения не соответствует th Тип содержимого привязки (text / xml; charset = utf-8). При использовании пользовательского кодировщика убедитесь, что IsContentTypeSuppor Метод Тед реализован правильно.

Это привело меня к погоне за диким гусем. Пока я не перехватил и не зарегистрировал все ошибки веб-служб и задач, я обнаружил следующую ошибку в задаче:

Тема была прервана.

Исправление было так же просто, как увеличение времени ожидания "потока":

HttpContext.Current.Server.ScriptTimeout = 900; // in seconds

Лучшим решением может быть выполнение этого асинхронно в отдельном потоке.

Это список тайм-аутов, необходимых для работы этого процесса. Код, конечно, будет отличаться в зависимости от языка / реализации:

C# Task: HttpContext.Current.Server.ScriptTimeout = 
C# Web Service (that calls task): this.Session.Timeout = 
C# Console Application (that calls web service): mySoapClient.InnerChannel.OperationTimeout = 
Powershell script (that calls console application): not required
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...