Wonky Start-Process ошибки после того, как скрипт был запущен некоторое время - PullRequest
0 голосов
/ 29 сентября 2011

У меня есть сценарий PowerShell 2.0, который работает с большими общими файлами сверху вниз, исправляя разрешения и т. Д., Запуская другой исполняемый файл через Start-Process и ожидая результатов и кодов выхода, с кодом, подобным этому:

Start-Process -FilePath $exe -ArgumentList $allargs -Wait -Passthru -NoNewWindow -RedirectStandardOutput $tempoutputfile -RedirectStandardError $temperrorfile;

Сценарий будет отлично работать в течение нескольких часов, обрабатывая тысячи записей, а затем в конечном итоге начнет выдавать странные ошибки, подобные следующим:

  • " Start-Process: невозможно обработать запрос, поскольку процесс (PID) завершен. " - процесс закрылся так быстро, что статус не был возвращен?

  • " Start-Process: эта команда не может быть выполнена из-за ошибки: недостаточно места для обработки этой команды. " - на общей файловой папке свободно более 20 ГБ Я работаю над системным диском на двух разных системах, на которых я тестировал (не говоря уже о свободной оперативной памяти и виртуальной памяти).

Обратите внимание, что я использую встроенный командлет Start-Process, а не PSCX - но, между прочим, он ведет себя одинаково (поскольку оба они основаны на .NET-классе процессов в любом случае).

Также обратите внимание, что это совсем не похоже на проблему управления памятью - процесс PowerShell достигает пика в менее чем 100 МБ рабочего набора на ранних этапах процесса и никогда не выходит за пределы этого в течение нескольких часов работы.

У кого-нибудь есть идеи, как остановить эти ошибки? Или как их отладить?

----- Решение -----

Спасибо @JPBlanc за указание на следующие решения:

1.) Чтобы устранить ошибки «Недостаточно памяти для обработки этой команды», я запустил сценарий PowerShell на локальном сервере, на котором размещен общий файловый ресурс (а не над общим ресурсом CIFS, на который влияет некоторая память). ограничения).

2.) Чтобы устранить ошибки «Невозможно обработать запрос, потому что процесс (PID) вышел»), мне пришлось добавить дополнительное тестирование свойства HasExited объекта System.Diagnostics.Process, как показано ниже:

$ps = Start-Process -FilePath $exe -ArgumentList $allargs -Wait -Passthru -NoNewWindow -RedirectStandardOutput $tempoutputfile -RedirectStandardError $temperrorfile;
do {} until ($ps.HasExited); # wait...
$ps.ExitCode; # <-- this is what I really needed from the output

Скрипт теперь работает без ошибок!

1 Ответ

2 голосов
/ 30 сентября 2011

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

---- Edited ------

Насколько я понимаю, «Невозможно обработать запрос, потому что процесс (PID) завершился») из-за того, что в Start-Process используется [Diagnostics.Process], а параметр -Wait воспроизводится без тестирования, если hasexited свойство верно или неверно. Чтобы исправить эту ошибку, я бы использовал свой код, чтобы точно определить, к какому файлу он добавляется. Для меня эта ошибка связана с конкретной ошибкой вашего $exe, вызванного с $allargs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...