Хобрук: Ваш путь к мастерству в программировании

Процесс запуска Powershell, ожидание с тайм-аутом, уничтожение и получение кода выхода

Я хочу многократно выполнять программу в цикле.

Иногда программа дает сбой, поэтому я хочу ее убить, чтобы следующая итерация могла начаться правильно. Я определяю это через тайм-аут.

У меня работает тайм-аут, но я не могу получить код выхода программы, который мне также нужен для определения ее результата.

Раньше я не ждал с таймаутом, а просто использовал -wait в Start-Process, но это приводило к зависанию скрипта, если запущенная программа падала. Однако с этой настройкой я мог правильно получить код выхода.

Я выполняю из ISE.

for ($i=0; $i -le $max_iterations; $i++)
{
    $proc = Start-Process -filePath $programtorun -ArgumentList $argumentlist -workingdirectory $programtorunpath -PassThru
    # wait up to x seconds for normal termination
    Wait-Process -Timeout 300 -Name $programname
    # if not exited, kill process
    if(!$proc.hasExited) {
        echo "kill the process"
        #$proc.Kill() <- not working if proc is crashed
        Start-Process -filePath "taskkill.exe" -Wait -ArgumentList '/F', '/IM', $fullprogramname
    }
    # this is where I want to use exit code but it comes in empty
    if ($proc.ExitCode -ne 0) {
       # update internal error counters based on result
    }
}

Как я могу

  1. Начать процесс
  2. Подождите, пока он упорядоченно выполнится и завершится
  3. Убейте его, если он разбился (например, тайм-аут хитов)
  4. получить код выхода из процесса


Ответы:


1

Вы можете завершить процесс проще, используя $proc | kill или $proc.Kill(). Имейте в виду, что в этом случае вы не сможете получить код выхода, вам следует просто обновить внутренний счетчик ошибок:

for ($i=0; $i -le $max_iterations; $i++)
{
    $proc = Start-Process -filePath $programtorun -ArgumentList $argumentlist -workingdirectory $programtorunpath -PassThru

    # keep track of timeout event
    $timeouted = $null # reset any previously set timeout

    # wait up to x seconds for normal termination
    $proc | Wait-Process -Timeout 4 -ErrorAction SilentlyContinue -ErrorVariable timeouted

    if ($timeouted)
    {
        # terminate the process
        $proc | kill

        # update internal error counter
    }
    elseif ($proc.ExitCode -ne 0)
    {
        # update internal error counter
    }
}
29.04.2016
  • Спасибо! Процесс ожидания правильно ожидает 400 с в вашем решении, но предложение # завершить процесс никогда не срабатывает после тайм-аута, поэтому процесс никогда не завершается, и после следующей итерации выполняются 2 процесса. (Я тестировал с небольшим тайм-аутом, чтобы вызвать этот случай.) 29.04.2016
  • Вы правы, я думал, что Wait-Process что-то вернет. Я отредактировал свой ответ, теперь я назначаю сообщение об ошибке $ timeouted, и в случае тайм-аута оно установлено. 29.04.2016
  • Спасибо! (Была небольшая опечатка.) Работает отлично! 29.04.2016
  • @MartinBrandl Можете ли вы уточнить, что такое значения -ea 0 -ev timeouted? Я нигде не могу найти их документально, но мне нужно определить, истекло ли время ожидания процесса ожидания или нет, и похоже, что это то, что вы используете в своем примере кода. 30.07.2018
  • Извините, не следует использовать псевдонимы. ea означает ErrorAction, а 0 — это значение перечисления для SilentlyContinue, поэтому я установил для ErrorAction для этой строки значение SilentlyContinue (что предотвращает остановку сценария в случае возникновения ошибки). -ev означает ErrorVariable. Я в основном определяю, что если возникает ошибка, записывайте ее в переменную $timeout. 30.07.2018
  • Разве тайм-аут в вызове Wait-Process не должен быть $timouted? 06.03.2020
  • @AlekDavis Нет, вы опускаете там знак $. 10.03.2020
  • О, я вижу. Значение содержит имя переменной, а не фактическую переменную. Спасибо. 12.03.2020
  • Новые материалы

    Понимание дженериков в TypeScript: подробное руководство
    Введение TypeScript, строго типизированный надмножество JavaScript, хорошо известен своей способностью улучшать масштабируемость, удобочитаемость и ремонтопригодность приложений. Одной из..

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..