Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
Unit service entered failed state (Result: exit-code / signal / timeout) Linux / DevOps

Unit entered failed state — Диагностика и исправление сбоев systemd

Обновлено: 18.08.2026  ·  Официальная база знаний

Архитектура ошибки и симптомы сбоя

Состояние «Unit service entered failed state (Result: exit-code / signal / timeout / resources)» — базовое уведомление диспетчера systemd о том, что жизненный цикл службы был принудительно прерван. Менеджер systemd классифицирует первопричину сбоя в поле Result:: отказ выполнения команды (exit-code), внешнее принудительное завершение процесса (signal), зависание скриптов запуска/остановки (timeout) или исчерпание системных дескрипторов и памяти (resources).

Диагностическая таблица параметров сбоя

ПараметрЗначениеИнженерный смысл сбоя
Result: exit-codeNon-zero ExitПриложение завершилось штатно с ошибкой конфигурации или рантайма.
Result: signalSIGKILL / SIGTERMПроцесс был убит извне (OOM Killer, внешний kill, ядро).
Result: timeoutWatchdog / StartupПревышен лимит TimeoutStartSec или сработал аппаратный Watchdog.
Result: resourcesENOMEM / EMFILEНевозможность аллокации сокетов, памяти, PID или файловых дескрипторов.

Пошаговое дерево решений и сценарии траблшутинга

Сценарий 1: Проверка точной категории сбоя через systemctl show

# Просмотр точного статуса завершения и кода результата:
systemctl show service_name.service -p Result -p ExecMainStatus -p ExecMainCode

# Проверка общего статуса службы:
sudo systemctl status service_name.service

Сценарий 2: Обработка сбоя Result: signal (поиск убийцы процесса)

Если служба завершилась по сигналу (например, signal=KILL или signal=TERM):

# Проверка, не был ли процесс уничтожен ядром из-за нехватки памяти (OOM Killer):
sudo dmesg -T | grep -i -E "(killed process|oom_reaper|out of memory)"

# Проверка логов auditd на предмет отправки сигналов kill сторонними процессами:
sudo ausearch -sc kill -ts recent

Сценарий 3: Обработка сбоя Result: resources (увеличение лимитов дескрипторов)

Если службе не хватает файловых дескрипторов (Too many open files):

# Редактирование лимитов службы:
sudo systemctl edit service_name.service

# Добавьте в конфигурацию неограниченные лимиты:
[Service]
LimitNOFILE=655360
LimitNPROC=655360
LimitMEMLOCK=infinity

# Примените настройки:
sudo systemctl daemon-reload
sudo systemctl restart service_name.service

Сценарий 4: Сброс аварийного состояния юнита

# Полная очистка состояния failed для всех юнитов системы:
sudo systemctl reset-failed
Службы регулярно выпадают в failed state на серверах высокой доступности?
ITSTM настроит комплексный стек мониторинга systemd-экспортера, оптимизирует лимиты cgroups и исключит аварийные падения демонов.
Практический опыт инженера: Для высоконагруженных демонов (ClickHouse, Elasticsearch, Kafka) всегда жестко прописывайте LimitNOFILE=1048576 и LimitMEMLOCK=infinity в override-файлах systemd, так как стандартные лимиты дистрибутивов (1024/4096) вызывают сбой Result: resources.

Частые вопросы (FAQ)

Чем Result: signal=KILL отличается от Result: exit-code?

exit-code означает, что приложение само вернуло код ошибки в операционную систему. signal=KILL означает, что само приложение не успело ничего обработать — операционная система или OOM Killer мгновенно уничтожили процесс без вызова деструкторов.

Почему после исправления ошибки служба не запускается по systemctl start?

Если служба превысила лимит попыток перезапуска (StartLimitHit), systemd блокирует дальнейшие запуски. Необходимо предварительно выполнить: sudo systemctl reset-failed <unit>.

Что означает директива LimitNOFILE в unit-файлах?

Директива LimitNOFILE устанавливает максимальное количество одновременно открытых файловых дескрипторов и сокетов (аналог ulimit -n) индивидуально для данного сервиса.

Как автоматически отправлять уведомление в Telegram при переходе сервиса в failed state?

Используйте директиву OnFailure=notify-telegram@%n.service в секции [Unit] и создайте вспомогательный юнит, отправляющий curl-запрос с именем упавшей службы.