Служба, не реагирующая на команду остановки
От: VoMarch  
Дата: 13.04.10 12:24
Оценка:
Здравствуйте!
В проекте возникла необходимость сделать так, чтобы Служба реагировала на команду остановки (SERVICE_CONTROL_STOP) только при определенных условиях (грубо говоря, когда все клиенты отключены от нее).
При реализации этой задачи сразу столкнулся со следующей проблемой: после 2-й попытки остановки Службы она останавливается независимо ни от каких условий.
В качестве тестовой Службы взял код службы voidsvc из http://rsdn.ru/article/?baseserv/svcadmin-1.xml
Автор(ы): Александр Федотов
Дата: 24.03.2002
В статье рассматриваются вопросы управления системными
службами Windows NT: чтение и изменение конфигурации, запуск и
остановка, установка и удаление служб. В статье описана большинство
функций управления службами, использование каждой функции
продемонстрировано примерами.
и видоизменил реакцию этой службы на команду остановки:
...
case SERVICE_CONTROL_STOP:
break;
...
После первой команды остановки реакция Службы адекватная: она игнорирует эту команду, состояние Службы остается RUNNING. Но после второй подачи этой команды процесс Службы завершается, даже не попадая в функцию обработки команд (проверял, подключившись отладчиком к процессу Службы). Точнее, на команду "sc stop void" получаем "[SC] ControlService FAILED 1061".
Пробовал и такой обработчик команды остановки:
...
case SERVICE_CONTROL_STOP:
_Status.dwCurrentState = SERVICE_RUNNING;
_VERIFY(SetServiceStatus( _hStatus, &_Status ) );
break;
...
результат тот-же.
ОС WinXP SP2.
Если кто-то сталкивался с подобной проблемой и может что-то посоветовать, буду очень признателен.
Спасибо.
Re: Служба, не реагирующая на команду остановки
От: EreTIk EreTIk's Box
Дата: 13.04.10 12:45
Оценка: 2 (1)
VM>В проекте возникла необходимость сделать так, чтобы Служба реагировала на команду остановки

при вызове SetServiceStatus() во флагах SERVICE_STATUS.dwControlsAccepted указывается флаг SERVICE_ACCEPT_STOP, который означает, что служба может быть остановлена. Т.е. этот флаг нужно выставить, когда сервис можно останавливать, а до этого времени просто не выставлять этот флаг. Когда этого флага нет, то команда останова вообще не будет доходить до сервиса и запрос будет отклонен SCM'ом
Re[2]: Служба, не реагирующая на команду остановки
От: VoMarch  
Дата: 13.04.10 13:24
Оценка:
Здравствуйте, EreTIk, Вы писали:

ETI>при вызове SetServiceStatus() во флагах SERVICE_STATUS.dwControlsAccepted указывается флаг SERVICE_ACCEPT_STOP, который означает, что служба может быть остановлена. Т.е. этот флаг нужно выставить, когда сервис можно останавливать, а до этого времени просто не выставлять этот флаг. Когда этого флага нет, то команда останова вообще не будет доходить до сервиса и запрос будет отклонен SCM'ом


Хорошая мысль. Попробую. Большое спасибо!
Re: Служба, не реагирующая на команду остановки
От: VoMarch  
Дата: 28.09.11 09:21
Оценка:
И все же пришлось еще раз вернуться к этой проблеме. Метод, с флагом SERVICE_ACCEPT_STOP до некоторых пор устраивал, но теперь необходимо именно в обработчике SERVICE_CONTROL_STOP производить проверки и в зависимости от результатов этих проверок завершать или не завершать службу. Т.о., возвращаюсь к исходному вопросу: почему после первой подачи команды Stop службе на все последующие команды SCM отвечает кодом "[SC] ControlService: ошибка: 1061: Служба в настоящее время не может принимать команды."? На повторную же команду Stop служба вообще завершается, минуя обработчик SERVICE_CONTROL_STOP. Информация о службе, которую я тестировал в стартовом сообщении темы.
Заранее спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.