输出重定向时PsExec挂起

时间:2014-03-03 20:20:15

标签: c# psexec

我在SO上看过类似的帖子,但似乎没有一个解决方案(对我有用)。所以张贴“又一个”,希望这个有助于找出错误。这也是SysInternals' Forum

上的交叉发布

我已经搜索了这个问题的答案(似乎很多人都在体验它),但似乎没有人找到一个可靠的解决方案。所以我想我会再次提出这个问题,因为这对我们来说非常痛苦。

我正在尝试使用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我必须有远程进程的退出代码。
  • -s没有帮助。
  • 没有捕获输出使它工作(但是因为我看不到psexec输出所以现在很难解决任何问题)。
    • 在Java中的姐妹项目中,它是另一种方式,而不是捕获输出使它以类似的方式失败。
  • -accepteula总是包括在内。
  • PAExec似乎也有类似的问题。
  • 问题似乎与PsExec hang while being executed from a very simple c# or c++ gui program compiled as "windows application"中描述的问题非常相似 我观察到PsExec标题出现在所有孩子的身边,但关于它正在做什么以及启动和结果的状态行似乎一次只出现一个 - 这意味着直到第一个孩子完成,第二个孩子的状态行直到第一个孩子才进入一个完成。不确定这是否与问题有关。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我在这样的Git命令行锁定方面遇到了很多问题,所以我写了一个小库来进行流程启动:

这使用std(in | out | err)的Windows管道,并以与System.Diagnostic.Process不同的方式进行互操作。