2

我使用 PsExec 执行多个命令行程序,但是当我调用自己的构建 C# (.net 4.0) 控制台应用程序时,PsExec 确实挂起,并且不会完成......

当调用其他控制台应用程序时,PsExec 将返回如下输出:

PsExec v1.98 - Execute processes remotely
Copyright (C) 2001-2010 Mark Russinovich
Sysinternals - www.sysinternals.com
Connecting to localhost...
Starting PsExec service on localhost...
Connecting with PsExec service on localhost...
Starting [MyExe] on localhost...
[myExe] exited on localhost with error code 0.

但是在我自己的 C# 控制台应用程序上只显示这个输出:

PsExec v1.98 - Execute processes remotely
Copyright (C) 2001-2010 Mark Russinovich
Sysinternals - www.sysinternals.com

我的控制台应用程序本身有一些日志记录,它执行得很好,并在大约 2 秒内以退出代码 0 退出,但 40 秒后,PsExec 仍然没有输出。

在目标机器上,PsExecSVR 仍然安装并运行。

我试图退出控制台应用程序

Environment.Exit();

并且还删除了这一行,并让控制台应用程序自行退出(通过让 void main 自行结束)。但是 PsExec 仍然没有运气。

4

3 回答 3

3

我在自动构建和部署脚本中遇到了这个问题。由于未知原因,当 psexec 在远程主机上有一些标准输出要“捕获”时,它可能会卡住。而且这种情况并非每次都发生...

要解决此问题,请避免在控制台上输出远程可执行文件,要么根本不产生输出(只是退出代码),要么将标准输出重定向到文件。

您可能需要调用 cmd.exe 来重定向标准输出

cmd /c "yourprogram.exe" > yourlog.txt

然后远程打开文件(从系统共享,例如 \\server\d$\folder\yourlog.txt)并将其转储到本地控制台。

希望这可以帮助。

于 2012-05-15T08:50:48.727 回答
1

当您从 PsExec 执行控制台时,请检查该过程是否确实完成。我的怀疑是它要么挂起等待输入(例如,它是否试图从标准输入读取并阻塞?),或者已经抛出异常并且当前(例如)处于“oops:{0}发生;按任何一个键退出”。

像这样执行时 exe 失败的经典原因:

  • 工作目录不是您所期望的(即它位于 PsExec 文件夹中,而不是您的应用程序的文件夹中)
  • 用户(不再是交互式用户 - 它甚至可能是访客帐户)缺少必要的权限,或者没有为该用户安装的东西
  • 它甚至可能试图在某处向您展示 UAC 对话框
于 2010-11-02T11:43:55.823 回答
0

Here is the code of the program that I get stuck with:

// Holds the Log4Net logger.
private static readonly Logger _Log = Logger.GetLogger(typeof(Program));
internal static void Main(string[] args)
  {
     Environment.ExitCode = 0;
     var result = false;
     try
     {
        _Log.Debug(new string('=', 80));
        _Log.Debug("Starting");
        _Log.Debug("Location: {0}", Assembly.GetExecutingAssembly().Location);

        if (args.Length != 5)
        {
           throw new InvalidOperationException("Invalid number of arguments");
        }
        if (args[0] != "/install" && args[0] != "/uninstall")
        {
           throw new InvalidOperationException("First argument should be \"/install\" or \"/uninstall\"");
        }
        if (args[0] == "/install")
        {
           _Log.Debug("Installing...");
           _Log.Debug("DO NOTHING, BUT START AND STOP!!!");
           result = true;
           _Log.Debug("Installed: Result={0}", result);
        }
        else if (args[0] == "/uninstall")
        {
           _Log.Debug("Uninstalling...");
           _Log.Debug("DO NOTHING, BUT START AND STOP!!!");
        }
     }
     catch (Exception e)
     {
        _Log.Error("ERROR: " + e.Message + "\r\n" + e.StackTrace);
        Environment.ExitCode = -1;
     }
     finally
     {
        _Log.Debug("Stopping...");
        if (result)
        {
           _Log.Debug("Setting ExitCode to 0.");
           Environment.ExitCode = 0;
        }
        else
        {
           _Log.Debug("Setting ExitCode to -1.");
           Environment.ExitCode = -1;
        }
     }

     _Log.Dispose();

     GC.Collect();
     GC.WaitForPendingFinalizers();

     _Log.Debug("Exiting with exitcode: {0}", Environment.ExitCode);
     Environment.Exit(Environment.ExitCode);
  }

The first time I call the code, the PsExec works fine, the second time (3rd etc.) do not work.

于 2010-11-02T13:09:04.617 回答