2

У меня есть служба, которая работает как Local System и иногда отказывается останавливаться.

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

SCM сообщает в журнал событий с идентификатором 7011:

Время ожидания (30000 миллисекунд) было достигнуто при ожидании ответа транзакции от ... службы.

После этого службы отображаются как остановленные в окне «Службы» в консоли управления и в WMI.

Но как Windows работает со службой, если она не прекращает работу? Я не могу перезапустить службу: процесс запуска старой службы все еще блокирует файлы и привязан к портам.

Я ожидаю, что Windows убьет процесс, который не отвечает, но я не могу найти какую-либо документацию или настройки по этому поводу.

30000 мсек, кажется, взято из HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ServicesPipeTimeout (https://support.microsoft.com/en-us/help/839803/the-windows-trace-session-manager-service-does-not-start -и-идентификатор события). Но через 30 секунд я получаю только событие, процесс все еще там.

Согласно аварийному дампу, основной поток был прерван, и есть несколько потоков, ожидающих на сокете в некотором WaitForSingleObject .

Мы уже сообщили об ошибке поставщику, и он пытается ее исправить. Но в основном вопрос в том, что делать, чтобы убить этот процесс, можно ли его очистить без перезагрузки.

1 ответ1

2

Возможно, ваш сервис остановлен, но потоки все еще работают, поэтому он находится в состоянии зомби. Общеизвестно, что в Windows трудно остановить потоки, и если они застряли в непрерывном системном вызове, их невозможно остановить.

Единственное решение состоит в том, чтобы лучше спроектировать ваш сервис, чтобы потоки могли сигнализировать об остановке, и этот сигнал устанавливается в методе OnStop() сервиса.

Потоки должны всегда превышать время ожидания для всех системных вызовов и проверять состояние их остановки, когда время ожидания срабатывает.

Альтернативой может быть использование метода OnStop() thread.Abort() чтобы остановить потоки. Обычно это плохая идея, потому что неизвестно, что может делать поток, когда остановлен, и в каком состоянии будут ресурсы, которые он изменяет после прерывания (что, кроме того, может быть неэффективным).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .