PsExec не обнаруживает, что мое консольное приложение на c # завершено - PullRequest
1 голос
/ 02 ноября 2010

Я использую 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

В моем консольном приложении есть некоторая запись в журнале, и оно прекрасно работает и завершает работу с кодом завершения 0 примерно через 2 секунды, но через 40 секунд PsExec по-прежнему не выводит.

На целевой машине PsExecSVR все еще установлен и работает.

Я пытался выйти из консольного приложения с помощью

Environment.Exit();

А также удалил эту строку и разрешил консольному приложению завершаться самостоятельно (позволяя void main завершаться самостоятельно). Но все еще не везет на PsExec.

Ответы [ 3 ]

2 голосов
/ 15 мая 2012

У меня была эта проблема в моих сценариях автоматической сборки и развертывания. По неизвестной причине psexec может застрять, когда у него есть стандартный вывод для «захвата» на удаленном хосте. И это происходит не каждый раз ...

Чтобы обойти это, избегайте вывода удаленных исполняемых файлов на консоль, либо вообще не выводите (просто код завершения), либо перенаправьте стандартный вывод в файл.

Возможно, вам придется вызвать cmd.exe, чтобы перенаправить стандартный вывод

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

Затем откройте файл удаленно (из системного общего ресурса, например \\ server \ d $ \ folder \ yourlog.txt) и выгрузите его на локальную консоль.

Надеюсь, это поможет.

1 голос
/ 02 ноября 2010

Когда вы запускаете консоль из PsExec, проверьте, действительно ли процесс завершается.Я подозреваю, что он либо завис в ожидании ввода (например, пытается ли он прочитать из stdin и блокирует?), Либо выдал исключение и в данный момент (например) находится в "oops: {0} произошло;нажмите любую клавишу для выхода ".

Классические причины сбоя exe-файла при его выполнении следующим образом:

  • рабочий каталог не тот, который вы ожидали (т.е. он находится впапка PsExec, а не папка вашего приложения)
  • пользователь (который больше не является интерактивным пользователем - это может быть даже гостевая учетная запись) не имеет необходимых разрешений или что-то не установлено для этого пользователя
  • Возможно, он даже пытается где-то показать диалог UAC
0 голосов
/ 02 ноября 2010

Вот код программы, с которой я застрял:

// 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 работает нормально, второй раз (3-й и т. Д.) Не работают.

...