Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Самоперезапуск службы, Самоперезапуск службы 
:(
    Опции темы
dvg13
Дата 21.9.2015, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 21.9.2015

Репутация: нет
Всего: нет



Доброго времени суток.
Есть рукописная служба, которая после обновления своего exe-файла должна сама себя перезапустить.
Будет ли правильным после отправки в менеджер служб SERVICE_STOPPED и перед самым завершением процесса службы вызвать StartService самого себя. Или менеджер служб продолжает следить за процессом службы и это будет в каких-то случаях некорректным. Интересует теоретическая правильность такого алгоритма. ОС >= XP.
PM MAIL   Вверх
feodorv
Дата 21.9.2015, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(dvg13 @  21.9.2015,  12:32 Найти цитируемый пост)
после обновления своего exe-файла

Можно Вас спросить, как у работающей службы был изменён её exe-файл?


Цитата(dvg13 @  21.9.2015,  12:32 Найти цитируемый пост)
перед самым завершением процесса службы вызвать StartService самого себя

Боюсь, что всё не просто. Если вызвать StartService до SERVICE_STOPPED, то, поскольку сервис ещё работает, ничего не выйдет. Если попробовать это сделать после, то тоже ничего не выйдет, поскольку в момент SERVICE_STOPPED менеджер сервисов прерывает исполнение процесса сервиса.


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


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dvg13
Дата 21.9.2015, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 21.9.2015

Репутация: нет
Всего: нет



При получении по сети файла для обновления служба выполняет 3 этапа:
1. Старый (выполняющийся) exe-файл при помощи MoveFileEx перемещается в свой каталог BACKUP.
2. На место старого пишется новый exe-файл.
3. Далее осуществляется перезапуск службы с помощью небольшой самописной утилитки(как вы и советовали) и всё, старая служба выполняется с новым exe-файлом.

Хотелось бы исключить именно посредника-утилиту, т.к. запуск её осуществляется легко, но после того как службы остановилась (процесс завершил работу) появляется бесконтрольное состояние работы утилиты. Вроде и выполняется десяток строк, но они могут не выполниться корректно и служба не поднимится.

Естественно сначала SERVICE_STOPPED, а потом StartService. Сомневаюсь, что менеджер служб завершает процесс сразу после получения SERVICE_STOPPED. Скорее он или вообще кладёт на процесс или делает это с некоторой задержкой. Никогда в своих службах я не отправлял SERVICE_STOPPED в последней строке в программе. К тому же процесс мгновенно не завершается, ну там разрушение статических объектов и т.д.
PM MAIL   Вверх
bass
Дата 21.9.2015, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: 2
Всего: 2



Цитата(feodorv @ 21.9.2015,  15:24)
Цитата(dvg13 @  21.9.2015,  12:32 Найти цитируемый пост)
после обновления своего exe-файла

Можно Вас спросить, как у работающей службы был изменён её exe-файл?


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

Сам ехе файл в момент работы можно перезаписать в ХР путем ниже приведенной ссылке.  
http://forum.vingrad.ru/forum/topic-384641.html#st_0_view_0

А вот все сторонние операции что бы работало и на 7-ке и других системах лучше делать правильно.
Если это обновление службы. То служба скачала файл, возможна проверка цифровой подписи.
Далее сохранение например в темп процесса выполняющего действия :
Остановки службы, перезаписи, запуск.
При этом нужно учитывать все зависимости службы, но это к вопросу не относиться.    
 Можно просто перезагрузить машину, если сама служба уже перезаписана.
Если подходит перезагрузка, можно посмотреть в сторону move after reboot.

PM MAIL   Вверх
dvg13
Дата 21.9.2015, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 21.9.2015

Репутация: нет
Всего: нет



В моём случае служба обновляется без останова. Используемые EXE, DLL не могут быть удалены, но перемещёны - пожалуйста, чем я и пользуюсь.
В конце концов основной вопрос наверное сводится к другому: какие действия может производить (или не производить) менеджер служб со службой, которая прислала код STOPPED, но её процесс ещё продолжает выполняется.
Конкретно на этот вопрос ответов я нигде не нашёл, а экперименты могут подталкнуть к неправильным выводам.

ЗЫ. Перезапуск ПК для перезапуска службы несколько крутовато.
PM MAIL   Вверх
bass
Дата 21.9.2015, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: 2
Всего: 2



Цитата(dvg13 @ 21.9.2015,  16:05)


Хотелось бы исключить именно посредника-утилиту, т.к. запуск её осуществляется легко, но после того как службы остановилась (процесс завершил работу) появляется бесконтрольное состояние работы утилиты. Вроде и выполняется десяток строк, но они могут не выполниться корректно и служба не поднимится..



Ну сделайте выполнение ее контрольным, запустите ее хоть два раза. Одна другую контролирует. Если произойдет перезагрузка, служба все равно запуститься. Наладите общение между сервисом и утилитой например через отображенный файл в памяти.  
Ну торная работа но правильным путем, на всех ОС работать будет... А эксперименты с недокументированными функциями чреваты подглючиванием.
С перезагрузкой, это смотря под какую задачу писать, в одной терминальной сети заказчик понаставил столько софта. Что без скрипта перезагрузки в нул нул... На следующие сутки вся сеть  начинала так тормознуто работать словами не описать... Зы и такое бывает.

Это сообщение отредактировал(а) bass - 21.9.2015, 18:06
PM MAIL   Вверх
dvg13
Дата 22.9.2015, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 21.9.2015

Репутация: нет
Всего: нет



Я проверил что происходит с процессом после того как в менеджер служб выдаётся статус STOPPED. У процесса есть 30 секунд для завершения, в противном случае система процесс убивает. Если я правильно помню и при старте тоже даётся 30 секунд для того чтобы процесс стал службой.

Добавлено через 1 минуту и 38 секунд
Наверно тему можно закрывать.
PM MAIL   Вверх
xvr
Дата 22.9.2015, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Поставьте сервису при регистрации опцию перезапуска при неожиданном завершении. Тогда вы можете просто выйти из службы (а лучше умереть по какому нибудь эксепшену) и ваш сервис будет автоматически перезапущен.

Цитата(dvg13 @  21.9.2015,  16:05 Найти цитируемый пост)
1. Старый (выполняющийся) exe-файл при помощи MoveFileEx перемещается в свой каталог BACKUP.

Это может не заработать на какой нибудь Win8 (а может быть уже и на Win7)

PM MAIL   Вверх
bass
Дата 22.9.2015, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: 2
Всего: 2



Цитата(xvr @ 22.9.2015,  10:37)
Поставьте сервису при регистрации опцию перезапуска при неожиданном завершении. Тогда вы можете просто выйти из службы (а лучше умереть по какому нибудь эксепшену) и ваш сервис будет автоматически перезапущен.

Это может не заработать на какой нибудь Win8 (а может быть уже и на Win7)

Вот если это не заработает в 7 ке или 8 ке (MoveFileEx) то опция перезапуска сервиса вполне не уместна..)))
PM MAIL   Вверх
dvg13
Дата 8.12.2015, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 21.9.2015

Репутация: нет
Всего: нет



Методология с MoveFileEx прекрасно работает и на Win10
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0861 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.