PsExec v 1.98 输出重定向问题

Posted

技术标签:

【中文标题】PsExec v 1.98 输出重定向问题【英文标题】:PsExec v 1.98 Output Redirection Issue 【发布时间】:2012-04-25 05:25:55 【问题描述】:

我认为之前关于这个主题的任何问题都没有给出这个问题的答案。我使用 psexec 执行远程 exe 文件。当我在命令行中运行它时,我得到了 exe 文件的输出。 psexec.exe \\machine C:\somename.exe. 当我使用 C sharp Process Execution 时,它要么挂起,要么不重定向输出。对于某些 exe,它超时,对于某些重定向标准输出为空,错误包含 Exe 退出,代码为 0。有什么方法可以捕获输出?

 ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.FileName =GetPsExecPath();
        startInfo.Arguments = arguments;
        Debug.WriteLine(arguments);
        startInfo.UseShellExecute = false;
        startInfo.RedirectStandardError = true;
        startInfo.RedirectStandardOutput = true;
        startInfo.CreateNoWindow = true;
        Process process = new Process();
        process.StartInfo = startInfo;
        process.Start();
        process.WaitForExit();
        error = process.StandardError.ReadToEnd();
        output = process.StandardOutput.ReadToEnd();
        Debug.WriteLine(error);
        Debug.WriteLine(output);
        process.close();

编辑:索恩 所以这个问题主要是因为 Psexec 把很多其他的东西扔到了标准错误中,因此我们读取它们的顺序,如果我们使用 ReadToEnd() 可能会导致死锁。所以如果我们使用 BeginOutputReadLine 它就像一个魅力!

【问题讨论】:

向我们展示你用来执行 psexec 的代码。 如果我不重定向输出和错误,它会执行并以代码 0 退出。只有当我重定向它时才会导致这些 pblms。 当你通过命令行运行它时,它会返回数据吗?使用您在程序中传递的相同参数? 是的。exe实际上打印了一行,并且确实在命令行中打印了。 好的,您能否编辑您的问题...谢谢,现在我们知道某些 EXE 的超时和/或不返回 StdError 消息。也许您需要使用带有进程监视器的 Netmon/WireShark 来比较超时与无输出并首先修复超时。 【参考方案1】:

此代码 sn-p 导致死锁的几率非常高。因为您首先阅读 StandardError,然后阅读 StandardOutput。这意味着 process.StandardOutput.ReadToEnd() 在进程退出之前不会被调用。这意味着当 psexec 填满足够的字符时,它将无法刷新其 stdout 输出缓冲区。这意味着它将阻塞,因此永远不会终止。死锁城市。

如果你交换两个调用,你会有更好的机会,大多数程序将大部分输出发送到标准输出。但是,如果 psexec 出于某种原因将大量字符写入 stderr,死锁的可能性仍然不为零。您可以改用 BeginOutputReadLine 和 BeginErrorReadLine 来完全消除这种情况。

【讨论】:

以上是关于PsExec v 1.98 输出重定向问题的主要内容,如果未能解决你的问题,请参考以下文章

查看重定向到 dev/null 的进程输出 - 撤消重定向

curl 重定向问题

远程启动应用程序时无法从 psexec 接收异步输出

07输入输出重定向

nohup: 重定向标准错误到标准输出问题解决方法

Linux重定向(输入重定向 | 输出重定向)