【发布时间】:2014-03-03 20:20:15
【问题描述】:
我在 SO 上看到了类似的帖子,但似乎没有一个解决方案(对我有用)。所以发布“又一个”,希望这个能帮助找出问题所在。这也被交叉发布在SysInternals' Forum
我已经搜索过这个问题的答案(而且似乎有不少人遇到过这个问题),但似乎没有人找到可靠的解决方案。所以我想我会再次提出这个问题,因为这对我们来说很痛苦。
我正在尝试使用 PsExec v2.0 在几台远程计算机上启动进程(并行),等待这些进程完成,然后检查错误代码以确保所有进程都成功完成。它似乎在某些机器上运行良好,但并非全部(在同事和客户环境中失败)。下面是如何使用的代码sn-p:
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 我必须有远程进程的退出代码。
- -s 没有帮助。
- 不捕获输出使其工作(但这是一个问题,因为现在任何问题都很难解决,因为我看不到 psexec 输出)。
- 在 Java 的姊妹项目中,情况正好相反,不捕获输出会以类似的方式失败。
- -accepteula 始终包含在内。
- PAExec 似乎也有类似的问题。
- 问题似乎与PsExec hang while being executed from a very simple c# or c++ gui program compiled as "windows application" 中描述的问题非常相似 我观察到 PsExec 标头立即出现在所有孩子身上,但是关于它正在做什么和启动以及结果的状态行似乎一次只出现一个 - 这意味着直到第一个孩子完成,第二个孩子的状态行直到第一个孩子之后才会出现一个完成。不确定这是否与问题有关。
任何帮助将不胜感激。
【问题讨论】:
-
你找到解决这个问题的可靠方法了吗?
-
@IgorMalin,那是很久以前的事了,所以我不记得了。我想我没有,但老实说,不记得了。对不起:(