Информация об изменениях

Сообщение Re: Правильная остановка долгозавершающейся службы от 14.04.2022 17:08

Изменено 14.04.2022 17:13 Игорь Вартанов

Re: Правильная остановка долгозавершающейся службы
Здравствуйте, nekoriu, Вы писали:

N>Есть задача правильно завершить долгозавершающуюся рабочую службу. Служба моя.


N>Написал тестовую службу для отработки завершения, которая завершается 5 минут. Через 2 минуты после отправки команды stop приложение Cлужбы выдает ошибку, Служба не ответила на запрос своевременно.


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

Я написал свой тестовый сервис, который использует механизм чекпоинтов. 5 минут стопится, отрабатывает без проблем, Win7 Pro. Здесь нужно добавить, что управлял я сервисом при помощи утилиты sc.exe, поскольку давно привык к этому в разработке. Запомним этот момент.

Затем посетила меня мысль пойти в оснастку сервисов и поуправлять при помощи неё. Вуаля, через 2 минуты получаю "Служба не ответила на запрос..." Опять же нужно добавить, что при остановке службы я любовался прогресс-баром оснастки. Окей, кто-то здесь лишний, ведь я точно знаю, что сервис рабочий.

(между тем, пришлось ребутнуть винду, т.к. сервис не хотел уходить из оснастки)

После перезагрузки снова запускаю и останавливаю мой сервис из оснастки, но теперь сразу отказываюсь от диалога с прогресс-баром. Контролирую остановку, как и раньше, командами sc query SvcLongStop. (SvcLongStop — название сервиса) Через 5 минут сервис штатно останавливается, но оснастка об этом не знает. Жму "Обновить" и вижу что сервис отражается теперь и в оснастке, как остановленный.

Итого в сухом остатке:
  • механизм чекпоинтов можно и нужно использовать для долгих переходных операций; сам по себе долгий переход не несет в себе ничего криминального и не надо пенять на архитектуру
  • для контроля за сервисами желательно использовать не- или слабо-интерактивные утилиты, либо написать свою, либо воспользоваться чужой, но проверенно надежной
  • майкрософту в целом верить можно, но иногда они дико косячат, и с этим ничего поделать нельзя, просто надо научится с этим жить

Нелишне добавить, что документация требует указывать dwWaitHint:

The estimated time required for a pending start, stop, pause, or continue operation, in milliseconds.

Какбы нелогично указывать его равным нулю. Но я потратил время на проверки (Win7 Pro) и не увидел разницы в поведении между 0 ms, точным значением таймаута между чекпоинтами 1000 ms и целиком пятиминутным значением. Сервисменеджеру просто по барабану. Ну и ладно. Смотри выше про майкрософт.
Re: Правильная остановка долгозавершающейся службы
Здравствуйте, nekoriu, Вы писали:

N>Есть задача правильно завершить долгозавершающуюся рабочую службу. Служба моя.


N>Написал тестовую службу для отработки завершения, которая завершается 5 минут. Через 2 минуты после отправки команды stop приложение Cлужбы выдает ошибку, Служба не ответила на запрос своевременно.


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

Я написал свой тестовый сервис, который использует механизм чекпоинтов. 5 минут стопится, отрабатывает без проблем, Win7 Pro. Здесь нужно добавить, что управлял я сервисом при помощи утилиты sc.exe, поскольку давно привык к этому в разработке. Запомним этот момент.

Затем посетила меня мысль пойти в оснастку сервисов и поуправлять при помощи неё. Вуаля, через 2 минуты получаю "Служба не ответила на запрос..." Опять же нужно добавить, что при остановке службы я любовался прогресс-баром оснастки. Окей, кто-то здесь лишний, ведь я точно знаю, что сервис рабочий.

(между тем, пришлось ребутнуть винду, т.к. сервис не хотел уходить из оснастки)

После перезагрузки снова запускаю и останавливаю мой сервис из оснастки, но теперь сразу отказываюсь от диалога с прогресс-баром. Контролирую остановку, как и раньше, командами sc query SvcLongStop. (SvcLongStop — название сервиса) Через 5 минут сервис штатно останавливается, но оснастка об этом не знает. Жму "Обновить" и вижу что сервис отражается теперь и в оснастке, как остановленный.

Итого в сухом остатке:
  • механизм чекпоинтов можно и нужно использовать для долгих переходных операций; сам по себе долгий переход не несет в себе ничего криминального и не надо пенять на архитектуру
  • для контроля за сервисами желательно использовать не- или слабо-интерактивные утилиты, либо написать свою, либо воспользоваться чужой, но проверенно надежной
  • майкрософту в целом верить можно, но иногда они дико косячат, и с этим ничего поделать нельзя, просто надо научится с этим жить

Нелишне добавить, что документация требует указывать dwWaitHint:

The estimated time required for a pending start, stop, pause, or continue operation, in milliseconds.

Какбы нелогично указывать его равным нулю. Но я потратил время на проверки (Win7 Pro) и не увидел разницы в поведении между 0 ms, точным значением таймаута между чекпоинтами 1000 ms и целиком пятиминутным значением. Сервисменеджеру просто по барабану. Ну и ладно. Смотри выше про майкрософт.



Тестовый сервис: http://files.rsdn.org/83/SvcLongStop.zip