PsExec зависает при перенаправлении вывода

Я видел подобные сообщения здесь, на SO, но, похоже, ни у кого нет решения (это работает для меня). Поэтому публикую «еще один» в надежде, что этот поможет определить, что не так. Это также опубликовано на форуме SysInternals.

Я искал ответы на эту проблему (и, похоже, с ней сталкивается довольно много людей), но, похоже, никто не нашел надежного решения. Поэтому я подумал, что подниму этот вопрос еще раз, так как это довольно больно для нас.

Я пытаюсь использовать PsExec v2.0 для запуска процессов на нескольких удаленных машинах (параллельно), дождаться завершения этих процессов, а затем проверить код ошибки, чтобы убедиться, что все завершено успешно. Похоже, что на некоторых машинах он работает нормально, но не на всех (не работает в среде коллеги и клиента). Вот фрагмент кода того, как он используется:

        foreach (WorkerServer worker in configSection.WorkerServers)
        {
            Process workerProcess = new Process();
            workerProcess.StartInfo.FileName = PsExecLocation;
            workerProcess.StartInfo.Arguments = BuildPsExecArguments(worker);

            if (configSection.CaptureOutput)
            {
                workerProcess.StartInfo.UseShellExecute = false;
                workerProcess.StartInfo.RedirectStandardError = true;
                workerProcess.StartInfo.RedirectStandardOutput = true;

                workerProcess.OutputDataReceived += new DataReceivedEventHandler(workerProcess_OutputDataReceived);
                workerProcess.ErrorDataReceived += new DataReceivedEventHandler(workerProcess_ErrorDataReceived);
            }

            workerProcess.Start();

            if (configSection.CaptureOutput)
            {
                workerProcess.BeginOutputReadLine();
                workerProcess.BeginErrorReadLine();
            }

            workerProcesses.Add(workerProcess);
        }

        foreach (Process process in workerProcesses)
        {
            process.WaitForExit();
            ......

Если выше установлен «CaptureOutput» и код проходит через настройку перехвата StdOut и StdErr, то на некоторых машинах мы наблюдаем, что удаленный рабочий процесс завершился, но PsExec все еще работает и не возвращает код выхода.

Вещи, которые пробовали/наблюдали до сих пор:

  • используя опцию -i. Когда с опцией, она вообще не работает, и я получаю ошибку 2250. Без него он подключается и запускает процесс.
  • Опция -d не является опцией b/c Я должен иметь код выхода удаленного процесса.
  • -с не помогло.
  • Not capturing output makes it work (but is an issue as any problems will now be hard to troubleshoot as I can't see psexec output).
    • On a sister project in Java, it is the other way around, not capturing output makes it fail in a similar way.
  • -accepteula всегда включен.
  • Похоже, что у PAExec тоже есть похожая проблема.
  • Проблема очень похожа на описанную в PsExec зависает при выполнении из очень простой программы графического интерфейса C# или C++, скомпилированной как приложение Windows. Я заметил, что заголовки PsExec появляются сразу у всех дочерних элементов, но строки состояния о том, что это кажется, что выполнение и запуск и результат появляются только по одному - это означает, что пока первый дочерний элемент не будет выполнен, строки состояния второго дочернего элемента не появятся до тех пор, пока не завершится первый. Не уверен, связано ли это с проблемой или нет.

Любая помощь приветствуется.


person LB2    schedule 03.03.2014    source источник
comment
Вы нашли надежное решение этой проблемы?   -  person Igor Malin    schedule 15.02.2017
comment
@IgorMalin, давно было, не помню. Я не думаю, что делал, но, честно говоря, не могу вспомнить. Извини :(   -  person LB2    schedule 16.02.2017


Ответы (1)


У меня было много проблем с блокировкой командной строки Git, поэтому я написал небольшую библиотеку для запуска процесса:

Это использует каналы Windows для std(in|out|err) и выполняет взаимодействие иначе, чем System.Diagnostic.Process.

person Iain Ballard    schedule 03.03.2014