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 からコンソールを実行する場合、プロセスが実際に終了するかどうかを確認します。私の疑いは、入力を待ってハングしたか (たとえば、stdin から読み取ろうとしてブロックされているか)、または例外をスローして現在 (たとえば) "おっと: {0} が発生しました。終了するには、任意のキーを押してください"。

次のように実行すると exe が失敗する典型的な理由:

  • 作業ディレクトリが期待どおりではありません (つまり、アプリのフォルダーではなく、PsExec フォルダーにあります)。
  • ユーザー (対話ユーザーではなくなった - ゲスト アカウントである可能性もあります) に必要な権限がないか、そのユーザーに何かがインストールされていません。
  • UACダイアログをどこかに表示しようとしている可能性さえあります
于 2010-11-02T11:43:55.823 に答える
0

これが私が立ち往生しているプログラムのコードです:

// 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);
  }

コードを初めて呼び出すと、PsExec は正常に動作しますが、2 回目 (3 回目など) は動作しません。

于 2010-11-02T13:09:04.617 に答える