![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
dvg13 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 21.9.2015 Репутация: нет Всего: нет |
Доброго времени суток.
Есть рукописная служба, которая после обновления своего exe-файла должна сама себя перезапустить. Будет ли правильным после отправки в менеджер служб SERVICE_STOPPED и перед самым завершением процесса службы вызвать StartService самого себя. Или менеджер служб продолжает следить за процессом службы и это будет в каких-то случаях некорректным. Интересует теоретическая правильность такого алгоритма. ОС >= XP. |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Можно Вас спросить, как у работающей службы был изменён её exe-файл?
Боюсь, что всё не просто. Если вызвать StartService до SERVICE_STOPPED, то, поскольку сервис ещё работает, ничего не выйдет. Если попробовать это сделать после, то тоже ничего не выйдет, поскольку в момент SERVICE_STOPPED менеджер сервисов прерывает исполнение процесса сервиса. В принципе, процесс сервиса, который нужно перезапустить, может создать дочерний процесс, который после завершения сервиса выдаст команду на его перезапуск. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
dvg13 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 21.9.2015 Репутация: нет Всего: нет |
При получении по сети файла для обновления служба выполняет 3 этапа:
1. Старый (выполняющийся) exe-файл при помощи MoveFileEx перемещается в свой каталог BACKUP. 2. На место старого пишется новый exe-файл. 3. Далее осуществляется перезапуск службы с помощью небольшой самописной утилитки(как вы и советовали) и всё, старая служба выполняется с новым exe-файлом. Хотелось бы исключить именно посредника-утилиту, т.к. запуск её осуществляется легко, но после того как службы остановилась (процесс завершил работу) появляется бесконтрольное состояние работы утилиты. Вроде и выполняется десяток строк, но они могут не выполниться корректно и служба не поднимится. Естественно сначала SERVICE_STOPPED, а потом StartService. Сомневаюсь, что менеджер служб завершает процесс сразу после получения SERVICE_STOPPED. Скорее он или вообще кладёт на процесс или делает это с некоторой задержкой. Никогда в своих службах я не отправлял SERVICE_STOPPED в последней строке в программе. К тому же процесс мгновенно не завершается, ну там разрушение статических объектов и т.д. |
|||
|
||||
bass |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 315 Регистрация: 5.8.2007 Репутация: 2 Всего: 2 |
Сам ехе файл в момент работы можно перезаписать в ХР путем ниже приведенной ссылке. http://forum.vingrad.ru/forum/topic-384641.html#st_0_view_0 А вот все сторонние операции что бы работало и на 7-ке и других системах лучше делать правильно. Если это обновление службы. То служба скачала файл, возможна проверка цифровой подписи. Далее сохранение например в темп процесса выполняющего действия : Остановки службы, перезаписи, запуск. При этом нужно учитывать все зависимости службы, но это к вопросу не относиться. Можно просто перезагрузить машину, если сама служба уже перезаписана. Если подходит перезагрузка, можно посмотреть в сторону move after reboot. |
|||
|
||||
dvg13 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 21.9.2015 Репутация: нет Всего: нет |
В моём случае служба обновляется без останова. Используемые EXE, DLL не могут быть удалены, но перемещёны - пожалуйста, чем я и пользуюсь.
В конце концов основной вопрос наверное сводится к другому: какие действия может производить (или не производить) менеджер служб со службой, которая прислала код STOPPED, но её процесс ещё продолжает выполняется. Конкретно на этот вопрос ответов я нигде не нашёл, а экперименты могут подталкнуть к неправильным выводам. ЗЫ. Перезапуск ПК для перезапуска службы несколько крутовато. |
|||
|
||||
bass |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 315 Регистрация: 5.8.2007 Репутация: 2 Всего: 2 |
Ну сделайте выполнение ее контрольным, запустите ее хоть два раза. Одна другую контролирует. Если произойдет перезагрузка, служба все равно запуститься. Наладите общение между сервисом и утилитой например через отображенный файл в памяти. Ну торная работа но правильным путем, на всех ОС работать будет... А эксперименты с недокументированными функциями чреваты подглючиванием. С перезагрузкой, это смотря под какую задачу писать, в одной терминальной сети заказчик понаставил столько софта. Что без скрипта перезагрузки в нул нул... На следующие сутки вся сеть начинала так тормознуто работать словами не описать... Зы и такое бывает. Это сообщение отредактировал(а) bass - 21.9.2015, 18:06 |
|||
|
||||
dvg13 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 21.9.2015 Репутация: нет Всего: нет |
Я проверил что происходит с процессом после того как в менеджер служб выдаётся статус STOPPED. У процесса есть 30 секунд для завершения, в противном случае система процесс убивает. Если я правильно помню и при старте тоже даётся 30 секунд для того чтобы процесс стал службой.
Добавлено через 1 минуту и 38 секунд Наверно тему можно закрывать. |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Поставьте сервису при регистрации опцию перезапуска при неожиданном завершении. Тогда вы можете просто выйти из службы (а лучше умереть по какому нибудь эксепшену) и ваш сервис будет автоматически перезапущен.
Это может не заработать на какой нибудь Win8 (а может быть уже и на Win7) |
|||
|
||||
bass |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 315 Регистрация: 5.8.2007 Репутация: 2 Всего: 2 |
Вот если это не заработает в 7 ке или 8 ке (MoveFileEx) то опция перезапуска сервиса вполне не уместна..))) |
|||
|
||||
dvg13 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 21.9.2015 Репутация: нет Всего: нет |
Методология с MoveFileEx прекрасно работает и на Win10
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |