C # Window Service и запуск / остановка cmd.exe - PullRequest
1 голос
/ 10 июня 2011

У меня есть C # Window Service, которая запускает пакетный файл (.bat), который, в свою очередь, выполняет приложение Java.Служба запускает файл .bat (cmd.exe) без проблем.Тем не менее, когда я пытаюсь остановить службу окна, процесс cmd.exe не умирает.Новый процесс cmd помещается в стек, если я снова запускаю службу.

Как уничтожить работающий процесс cmd.exe?

Код:

    private const string BATCH_FILE_PATH_APPKEY = "Service_Batch_File_Path";
    private const string BATCH_FILE_DEFAULT = "Service.bat";

    private static Process _proc;
    private static bool _hasStarted = false;

    public AService()
    {
        InitializeComponent();
        _proc = new Process();
    }

    protected override void OnStart(string[] args)
    {
        try
        {

            string appDirectory = System.Windows.Forms.Application.ExecutablePath;
            appDirectory = appDirectory.Substring(0, appDirectory.LastIndexOf("\\"));
            string workingDirectory = appDirectory;
            string batchFilePath = string.Empty;
            batchFilePath = workingDirectory + "Service.bat";

            // Make sure it exists


            _proc.StartInfo = new ProcessStartInfo(batchFilePath);
            _proc.StartInfo.CreateNoWindow = true;
            _proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            _proc.Start();
            _hasStarted = true;
        }
        catch (System.Exception ex)
        {
            eventLog1.WriteEntry(ex.ToString() + "\n\nStack Trace:\n" + ex.StackTrace);
            OnStop();
        }
    }

    protected override void OnStop()
    {
        if (_hasStarted)
            _proc.CloseMainWindow();
            //_proc.Close(); 
    }

TIA, Alex.

Ответы [ 3 ]

0 голосов
/ 10 июня 2011

Вы пробовали _proc.Kill() в обработке закрытия вашего сервиса? Это асинхронный режим, и вам следует позвонить WaitForExit , чтобы дать ему достойный шанс уйти. Записывайте любые сбои или исключения в этой логике для расследования.

Вы также должны (для чистоты) восстановить _proc.Close() после вызова WaitForExit(), чтобы Dispose() был правильно вызван для Process. Я знаю, что ваша служба скоро будет закрыта, но это хорошая привычка, и это означает, что у вас меньше шансов утечки, если вы решите управлять дочерним процессом более динамично в будущем.

0 голосов
/ 11 июня 2011

_proc.Kill () будет работать .... но оно потеряет ваше Java-приложение. Я сделал нечто подобное, когда был запущен третий процесс. Вам также нужно знать, какой Java-процесс убить. Для этого вы можете использовать счетчик производительности ParentProcess.

Вот некоторые подробности об использовании счетчика производительности ParentProcess .

Кроме того, версию Windows вы планируете развернуть? WindowsServer2008, кажется, имеет cmd.exe и conhost.exe. Это может создать для вас проблему (опять же, возможно, ее можно решить, зная родительский процесс.

0 голосов
/ 10 июня 2011

_proc.Kill ();

См. Подробности в MSDN: Метод Process.Kill

Вы можете найти следующую ссылку очень полезной: Process.Close () не завершает созданный процесс, c #

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