Сообщение 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:
N>Есть задача правильно завершить долгозавершающуюся рабочую службу. Служба моя.
N>Написал тестовую службу для отработки завершения, которая завершается 5 минут. Через 2 минуты после отправки команды stop приложение Cлужбы выдает ошибку, Служба не ответила на запрос своевременно.
Несмотря на застарелый тред (больше года утекло) попытаюсь ответить. Возможно, кому-то будет полезно.
Я написал свой тестовый сервис, который использует механизм чекпоинтов. 5 минут стопится, отрабатывает без проблем, Win7 Pro. Здесь нужно добавить, что управлял я сервисом при помощи утилиты sc.exe, поскольку давно привык к этому в разработке. Запомним этот момент.
Затем посетила меня мысль пойти в оснастку сервисов и поуправлять при помощи неё. Вуаля, через 2 минуты получаю "Служба не ответила на запрос..." Опять же нужно добавить, что при остановке службы я любовался прогресс-баром оснастки. Окей, кто-то здесь лишний, ведь я точно знаю, что сервис рабочий.
(между тем, пришлось ребутнуть винду, т.к. сервис не хотел уходить из оснастки)
После перезагрузки снова запускаю и останавливаю мой сервис из оснастки, но теперь сразу отказываюсь от диалога с прогресс-баром. Контролирую остановку, как и раньше, командами sc query SvcLongStop. (SvcLongStop — название сервиса) Через 5 минут сервис штатно останавливается, но оснастка об этом не знает. Жму "Обновить" и вижу что сервис отражается теперь и в оснастке, как остановленный.
Итого в сухом остатке:
- механизм чекпоинтов можно и нужно использовать для долгих переходных операций; сам по себе долгий переход не несет в себе ничего криминального и не надо пенять на архитектуру
для контроля за сервисами желательно использовать не- или слабо-интерактивные утилиты, либо написать свою, либо воспользоваться чужой, но проверенно надежной
майкрософту в целом верить можно, но иногда они дико косячат, и с этим ничего поделать нельзя, просто надо научится с этим жить
Нелишне добавить, что документация требует указывать dwWaitHint:
Какбы нелогично указывать его равным нулю. Но я потратил время на проверки (Win7 Pro) и не увидел разницы в поведении между 0 ms, точным значением таймаута между чекпоинтами 1000 ms и целиком пятиминутным значением. Сервисменеджеру просто по барабану. Ну и ладно. Смотри выше про майкрософт.The estimated time required for a pending start, stop, pause, or continue operation, in milliseconds.
Re: Правильная остановка долгозавершающейся службы
Здравствуйте, nekoriu, Вы писали:
N>Есть задача правильно завершить долгозавершающуюся рабочую службу. Служба моя.
N>Написал тестовую службу для отработки завершения, которая завершается 5 минут. Через 2 минуты после отправки команды stop приложение Cлужбы выдает ошибку, Служба не ответила на запрос своевременно.
Несмотря на застарелый тред (больше года утекло) попытаюсь ответить. Возможно, кому-то будет полезно.
Я написал свой тестовый сервис, который использует механизм чекпоинтов. 5 минут стопится, отрабатывает без проблем, Win7 Pro. Здесь нужно добавить, что управлял я сервисом при помощи утилиты sc.exe, поскольку давно привык к этому в разработке. Запомним этот момент.
Затем посетила меня мысль пойти в оснастку сервисов и поуправлять при помощи неё. Вуаля, через 2 минуты получаю "Служба не ответила на запрос..." Опять же нужно добавить, что при остановке службы я любовался прогресс-баром оснастки. Окей, кто-то здесь лишний, ведь я точно знаю, что сервис рабочий.
(между тем, пришлось ребутнуть винду, т.к. сервис не хотел уходить из оснастки)
После перезагрузки снова запускаю и останавливаю мой сервис из оснастки, но теперь сразу отказываюсь от диалога с прогресс-баром. Контролирую остановку, как и раньше, командами sc query SvcLongStop. (SvcLongStop — название сервиса) Через 5 минут сервис штатно останавливается, но оснастка об этом не знает. Жму "Обновить" и вижу что сервис отражается теперь и в оснастке, как остановленный.
Итого в сухом остатке:
Нелишне добавить, что документация требует указывать dwWaitHint:
Тестовый сервис: http://files.rsdn.org/83/SvcLongStop.zip
N>Есть задача правильно завершить долгозавершающуюся рабочую службу. Служба моя.
N>Написал тестовую службу для отработки завершения, которая завершается 5 минут. Через 2 минуты после отправки команды stop приложение Cлужбы выдает ошибку, Служба не ответила на запрос своевременно.
Несмотря на застарелый тред (больше года утекло) попытаюсь ответить. Возможно, кому-то будет полезно.
Я написал свой тестовый сервис, который использует механизм чекпоинтов. 5 минут стопится, отрабатывает без проблем, Win7 Pro. Здесь нужно добавить, что управлял я сервисом при помощи утилиты sc.exe, поскольку давно привык к этому в разработке. Запомним этот момент.
Затем посетила меня мысль пойти в оснастку сервисов и поуправлять при помощи неё. Вуаля, через 2 минуты получаю "Служба не ответила на запрос..." Опять же нужно добавить, что при остановке службы я любовался прогресс-баром оснастки. Окей, кто-то здесь лишний, ведь я точно знаю, что сервис рабочий.
(между тем, пришлось ребутнуть винду, т.к. сервис не хотел уходить из оснастки)
После перезагрузки снова запускаю и останавливаю мой сервис из оснастки, но теперь сразу отказываюсь от диалога с прогресс-баром. Контролирую остановку, как и раньше, командами sc query SvcLongStop. (SvcLongStop — название сервиса) Через 5 минут сервис штатно останавливается, но оснастка об этом не знает. Жму "Обновить" и вижу что сервис отражается теперь и в оснастке, как остановленный.
Итого в сухом остатке:
- механизм чекпоинтов можно и нужно использовать для долгих переходных операций; сам по себе долгий переход не несет в себе ничего криминального и не надо пенять на архитектуру
для контроля за сервисами желательно использовать не- или слабо-интерактивные утилиты, либо написать свою, либо воспользоваться чужой, но проверенно надежной
майкрософту в целом верить можно, но иногда они дико косячат, и с этим ничего поделать нельзя, просто надо научится с этим жить
Нелишне добавить, что документация требует указывать dwWaitHint:
Какбы нелогично указывать его равным нулю. Но я потратил время на проверки (Win7 Pro) и не увидел разницы в поведении между 0 ms, точным значением таймаута между чекпоинтами 1000 ms и целиком пятиминутным значением. Сервисменеджеру просто по барабану. Ну и ладно. Смотри выше про майкрософт.The estimated time required for a pending start, stop, pause, or continue operation, in milliseconds.
Тестовый сервис: http://files.rsdn.org/83/SvcLongStop.zip