Event ID 7043: служба не завершилась корректно при выключении системы
Симптомы сбоя выключения службы (Event ID 7043)
В журнале System фиксируется ошибка: Event ID 7043: The [Имя_службы] service did not shut down properly after receiving a preshutdown control. При выключении или перезагрузке сервера служба проигнорировала сигнал SERVICE_CONTROL_PRESHUTDOWN или не успела завершить сохранение данных в отведенный таймаут.
| Симптом | Последствия |
|---|---|
| Долгое выключение сервера | Экран «Завершение работы служб» висит по 10–20 минут |
| Повреждение несохраненных данных | Служба принудительно убивается ядром по истечении системного таймаута |
| Сбои баз данных при старте | Необходимость выполнения долгой процедуры Recovery/Replay журналов транзакций |
Пошаговое устранение зависания служб при выключении (Event ID 7043)
- Увеличьте таймаут предварительного завершения работы (PreshutdownTimeout): службам баз данных требуется время на сброс грязных страниц из памяти на диск:
# Увеличение таймаута PreshutdownTimeout для службы до 3 минут (180000 мс):
$serviceName = "ИмяСлужбы"
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\$serviceName" -Name "PreshutdownTimeout" -Value 180000 -Type DWord -Force- Уменьшите глобальный таймер принудительного убийства зависших служб (WaitToKillServiceTimeout):
# Установка времени ожидания закрытия зависших служб в 15 секунд (по умолчанию 5000-20000 мс):
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control" -Name "WaitToKillServiceTimeout" -Value "15000" -Type String -Force- Проверьте дисковые задержки при выключении: если сервер выключается медленно, проверьте дисковую подсистему на наличие очередей записи (Disk Queue Length) во время создания контрольных точек.
Совет: Перед плановой перезагрузкой высоконагруженных серверов баз данных (MS SQL, Oracle, PostgreSQL, Exchange) останавливайте службы вручную через PowerShell — это исключит каскадные таймауты SCM.
Частые вопросы (FAQ)
Что такое сигнал Preshutdown в Windows?
Это специальный сигнал, введенный в Windows Server, позволяющий критическим службам корректно завершить запись до того, как начнется глобальная остановка базовых системных сервисов.
Почему служба зависает именно при выключении?
Служба может ожидать ответа от сети или удаленного сервера, который в процессе shutdown уже был отключен ранее по цепочке приоритетов.
Где находится глобальный параметр WaitToKillServiceTimeout?
В ветке реестра: HKLM:\SYSTEM\CurrentControlSet\Control.
Как безопасно остановить службы SQL перед перезагрузкой скриптом?
Выполните команду: Stop-Service -Name MSSQLSERVER -Force перед выполнением Restart-Computer.