Nano Hash - криптовалюты, майнинг, программирование

API ServiceController не распознает, что служба остановлена

Я работаю над установщиком, который копирует файлы в Program Files, а затем запускает службу (через один из скопированных файлов). При первой установке это будет работать без проблем, но проблемы начинают возникать, когда программа установки запущена, а служба уже запущена на машине. Это связано с тем, что установщик пытается заменить файлы, которые уже существуют в Program Files, но один из этих файлов используется службой Windows, поэтому его нельзя заменить, пока служба не будет остановлена.

Поэтому я решил использовать API ServiceController, чтобы остановить службу в начале установки, установить файлы (перезаписав существующие файлы) и снова запустить службу. Кода очень мало, но вот он:

Создайте экземпляр ServiceController:

try
{
    service = new ServiceController(serviceName);
}
catch (InvalidOperationException ioe)
{
    // ...
}

Остановка службы:

if (service.Status != ServiceControllerStatus.Stopped)
{
    service.Stop();
}

Затем дождитесь остановки службы и установите файлы:

service.WaitForStatus(ServiceControllerStatus.Stopped);
// install files...

И, наконец, перезапустите службу:

service.Start();

С этим кодом метод service.WaitForStatus() будет просто ждать вечно (или дольше, чем я готов ждать, по крайней мере, до часа). Странно то, что я могу запустить этот код, записать service.Status() в журнал, проверить службу вручную, чтобы убедиться, что она остановлена, проверить журнал и увидеть, что ServiceController считает, что служба все еще работает.

Сначала я подумал, что проблема связана с service.Stop(), поэтому я попытался создать пару объектов Process, которые получили PID службы, а затем убили задачу, которая мгновенно останавливает службу, но все равно ServiceController не распознает, что служба остановлена. Если я удалю метод service.WaitForStatus() из своего кода, будет выдано исключение, поскольку программа установки пытается перезаписать файл, используемый службой.

Кроме того, я пробовал это с разными службами, но результат всегда один и тот же, что заставляет меня поверить, что проблема не в самой службе.

Почему ServiceController не распознает, что служба остановлена? Есть ли решение или обходной путь этой проблемы? Я работаю с .NET 2.0, поэтому все, что требует выше, к сожалению, не для меня. Ваше здоровье.


Ответы:


1

Этот ответ может не соответствовать вашему вопросу, но может дать представление. Я также столкнулся с парой проблем при остановке служб с помощью «ServiceController», а также, как указано в этой статье stop">Прочитать ответ EricJ, я реализовал, как показано ниже

 service.Stop();

 service.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromMinutes(5));

ServiceController ждет 5 минут, чтобы остановить службу, если не выдает TimeOutException, где я вызываю команду TaskKill для завершения процесса. Ниже приведен код

using (Process process = new Process())
            {
                try
                {
                    string arguments = "/F /T /IM {0}";
                    process.StartInfo.FileName = "taskkill";
                    process.StartInfo.Arguments = string.Format(arguments, processName); ;
                    process.StartInfo.UseShellExecute = false;
                    process.StartInfo.RedirectStandardOutput = true;
                    process.StartInfo.RedirectStandardError = true;

                    StringBuilder output = new StringBuilder();
                    StringBuilder error = new StringBuilder();

                    using (AutoResetEvent outputWaitHandle = new AutoResetEvent(false))
                    using (AutoResetEvent errorWaitHandle = new AutoResetEvent(false))
                    {
                        process.OutputDataReceived += (sender, e) =>
                        {
                            if (e.Data == null)
                            {
                                outputWaitHandle.Set();
                            }
                            else
                            {
                                output.AppendLine(e.Data);
                            }
                        };
                        process.ErrorDataReceived += (sender, e) =>
                        {
                            if (e.Data == null)
                            {
                                errorWaitHandle.Set();
                            }
                            else
                            {
                                error.AppendLine(e.Data);
                            }
                        };

                        process.Start();
                        process.BeginOutputReadLine();
                        process.BeginErrorReadLine();

                        if (process.WaitForExit(timeout) &&
                            outputWaitHandle.WaitOne(timeout) &&
                            errorWaitHandle.WaitOne(timeout))
                        {
                            if (process.ExitCode == 0)
                                // Success Message
                        }
                        else
                        {
                            // Fail Message
                        }
                    }
                    if (!string.IsNullOrEmpty(output.ToString()))
                       //Out put

                    if (!string.IsNullOrEmpty(error.ToString()))
                        //Error out put
                }
                catch (Exception ex)
                {
                    Comments = ex.Message;
                    //Exception logging
                }
            }
28.07.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..