WindowsService вызывает внешний процесс CMD - PullRequest
0 голосов
/ 09 октября 2018

Я разработал Windows Service Process под названием WSP, который вызывает плохо документированное внешнее консольное приложение, разработанное крупной компанией, также известной как External.exe.

Мой WSP работает каждые 2 часа без ошибок, вызывая External.exe, который выполняется отлично.Иногда я не знаю почему, External.exe завершается с кодом ошибки <> 0. Как я уже говорил, документации по этому вопросу нет, и она случайная.

Проблема в том, что: External.exe возвращает код <> 0, все последующие вызовы External.exe завершатся неудачно.

Чтобы решить эту проблему, мне нужно перезапустить WSP вручную в Services.msc (да, я попытался перезапустить WSP программно, и, как язнать, что служба не может перезапустить себя).После этого все шаги в WSP работают как положено.

У кого-нибудь была такая проблема?

   private static bool ExecuteCommandLineTransformProcess(string inputFullPath, string transformerCommandLine)
    {
        var success = false;
        var info = new ProcessStartInfo("cmd.exe", transformerCommandLine);

        info.CreateNoWindow = true;
        info.WindowStyle = ProcessWindowStyle.Hidden;
        info.RedirectStandardOutput = true;
        info.UseShellExecute = false;

        //Launching External.EXE tool with parameters
        using (var pr = Process.Start(info))
        {
            pr.WaitForExit();

            if (pr.HasExited)
            {            
                //pr.ExitCode is the return off external window process, expected 0 when no errorsfound
                success = pr.ExitCode == 0;

                if (pr.ExitCode != 0)
                { 
                    LoggerHelper.Log.Warn($"Transformer - Finished - ##With errors!!! : {pr.ExitCode} .");
                    //After This Error, all callings to External.Exe will fail silently (not working and ExitCode as 0)

                }

                LoggerHelper.Log.Info($"Transformer - Finished.");
                pr.Refresh();
            }
        }

        return success;
    }

Я посмотрел на TaskManager и External.Exe, по-видимому, не работает в фоновом режиме;Я попытался обойти принудительный перезапуск в WSP, но, как я уже сказал, WindowsService не может перезапустить себя;И да, я искал в Переполнении стека, в Google и в Документах по поставкам для большой компании.

Я принимаю все идеи и заранее благодарен

....

Обновление, япопытался форсировать Throw New, за исключением случая ExitCode! = 0 ... и неожиданно WSP все еще жив и не вызывает перезапуск WSP, авто-перезапуск.В поисках этого я нашел много предложений, таких как: «Создайте другой процесс, чтобы принудительно перезапустить это»;«Отправить CMD KillProcess в WSP» ... Это не варианты для меня.

Сейчас я тестирую другой подход, использую WSP.Dispose () (который наследуется от класса ServiceBase) при каждом завершении выполнения.,К настоящему времени я опубликовал WSP в тестовой среде и все еще жду.

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Спасибо, Дин,

Я знал, как автоматически перезапускать / восстанавливать службы при сбое, но я не знаю, является ли это хорошей практикой.В моем случае pr.ExitCode! = 0 - это возможный результат, и я его регистрирую.В другой руке я предпочитаю не бросать новое исключение.Я думал об этом ранее, но я не удовлетворен этим подходом

0 голосов
/ 09 октября 2018

Мои лучшие предположения: - Информация о процессе хранится в памяти и не корректно размещается. - Файл, используемый как вашей службой, так и External.exe, блокируется, поэтому External.exe завершается ошибкой, потому что не можетдоступ к нему.При перезапуске службы блокировка снимается, и это устраняет проблему.

0 голосов
/ 09 октября 2018

Служба может перезапустить себя, используя параметры на вкладке Восстановление свойств службы:

enter image description here

Когда внешние исполняемые ошибки выдают исключение, которое будетпрервите выполнение службы, и настройки на вкладке «Восстановление» включатся и перезапустят службу ...

Вы также можете создать другую службу Windows, о которой ваша служба "WSP" будет оповещать, используя IPC (межпроцессное взаимодействие).) , если External.exe возвращает код <> 0 и единственной целью которого будет перезапуск службы "WSP" после этого предупреждения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...