Я видел подобные сообщения здесь, на 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 появляются сразу у всех дочерних элементов, но строки состояния о том, что это кажется, что выполнение и запуск и результат появляются только по одному - это означает, что пока первый дочерний элемент не будет выполнен, строки состояния второго дочернего элемента не появятся до тех пор, пока не завершится первый. Не уверен, связано ли это с проблемой или нет.
Любая помощь приветствуется.