Что значит ошибка Systemd Service Timeout
Ошибка Failed to start <service_name>.service: Unit <service_name>.service entered the failed state. или Job for <service_name>.service timed out возникает, когда systemd не может запустить службу в течение времени, заданного параметром TimeoutStartSec (по умолчанию 90 секунд для простых служб). Systemd прерывает процесс запуска и помечает службу как failed.
Типичный вывод:
$ systemctl status nginx.service
● nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: failed (Result: timeout) since Thu 2026-02-17 10:30:00 MSK; 1min 30s ago
Process: 1234 ExecStart=/usr/sbin/nginx -g daemon off; (code=exited, status=0/SUCCESS)
Main PID: 1234 (code=exited, status=0/SUCCESS)
Feb 17 10:28:30 host systemd[1]: Starting The nginx HTTP and reverse proxy server...
Feb 17 10:30:00 host systemd[1]: nginx.service: Start operation timed out. Terminating.
Feb 17 10:30:00 host systemd[1]: nginx.service: Failed with result 'timeout'.
Feb 17 10:30:00 host systemd[1]: Failed to start The nginx HTTP and reverse proxy server.
Причины возникновения
- Долгий запуск приложения. Служба физически требует больше времени, чем
TimeoutStartSec(например, инициализация большого кэша, подключение к удалённой БД, обработка большого объёма данных при старте). - Неправильный
Type=в юните. ДляType=simplesystemd считает службу запущенной сразу после завершения командыExecStart. Если процесс демона не демонизируется (не делает fork), а продолжает работать в том же процессе, systemd будет ждать его завершения и в итоге таймаутит. НуженType=notifyилиType=forking. - Блокировка на ресурсах. Служба ждёт недоступный ресурс: сетевой интерфейс не поднят, диск не смонтирован, порт занят другим процессом, недостаточно прав на доступ к файлу.
- Ошибка в скрипте инициализации (pre-start). Команды в
ExecStartPre=зависают или выполняются очень долго. - Конфликт с другим процессом. Порт, который хочет занять служба, уже используется, и она не может корректно завершить инициализацию.
Способы решения
Способ 1: Диагностика через журнал (journalctl)
Первым делом нужно понять, что именно делает служба в момент таймаута.
- Посмотрите полный лог службы за последние минуты:
journalctl -u <service_name>.service --since "5 minutes ago" -e
Ключ-eперемотит к концу файла. Ищите строки, предшествующиеTimed out starting. Там может быть ошибка подключения, недостаток памяти, permission denied. - Если логи не очень информативны, запустите службу в режиме отладки вручную, чтобы увидеть вывод в консоль:
# Остановите службу sudo systemctl stop <service_name> # Запустите команду ExecStart напрямую (найдите её через `systemctl cat <service_name>`) sudo -u <user> <путь_к_исполняемому_файлу> <аргументы> # ИЛИ для скриптов sudo bash -x /путь/к/скрипту/запуска.sh
Флаг-xв bash покажет каждую выполненную команду, что поможет найти зависший шаг.
💡 Совет: Если служба пишет логи в отдельный файл (а не в journald), проверьте и его:
sudo tail -f /var/log/<service_name>/<service_name>.log.
Способ 2: Временное увеличение таймаута
Чтобы понять, проблема именно в времени запуска или в зависании, временно увеличьте лимит.
- Создайте переопределение (drop-in) для службы:
sudo systemctl edit <service_name>
Откроется редактор. Вставьте:[Service] TimeoutStartSec=300
Сохраните и закройте (дляnano— Ctrl+X, Y, Enter). - Перезагрузите конфигурацию systemd и перезапустите службу:
sudo systemctl daemon-reload sudo systemctl restart <service_name> - Проверьте статус:
systemctl status <service_name>
Если служба запустилась с таймаутом 300 секунд — проблема в долгом старте. Нужно оптимизировать процесс инициализации (уменьшить объём данных, которые она обрабатывает при старте, добавить асинхронную загрузку) и вернуть разумный таймаут (например, 60s).
Способ 3: Исправление типа службы (Type=)
Частая ошибка — использование Type=simple для служб, которые не демонизируются (не делают fork). Systemd ждёт, пока процесс завершится, а тот продолжает работать, и в итоге срабатывает таймаут.
- Проверьте текущий тип:
systemctl show <service_name> -p Type
илиsystemctl cat <service_name> | grep ^Type - Определите правильный тип:
Type=forking— классический демон, который делает fork и родительский процесс завершается. Проверьте, есть ли в логахStartedпосле запуска.Type=notify— служба уведомляет systemd о готовности черезsd_notify(0). Требует поддержки в приложении (часто в современных сервисах на Go, Node.js). Указан в документации ПО.Type=oneshot— для скриптов, которые должны завершиться до того, как служба считается активной. Не подходит для долгих фоновых процессов.
- Измените тип в юните (через
systemctl editили напрямую в файле.service):[Service] Type=forking # или Type=notify - Перезагрузите и перезапустите.
Способ 4: Анализ зависимостей и скриптов pre-start
Служба может зависнуть на этапе ExecStartPre= или из-за невыполнения условий After=/Requires=.
- Проверьте все команды, выполняемые ДО основного запуска:
systemctl cat <service_name> | grep ExecStartPre
Запустите каждую из этих команд вручную. Если какая-то зависнет (например, ожидание ответа от базы данных, проверка диска) — это и есть причина. - Проверьте порядок запуска и зависимости:
systemctl list-dependencies <service_name>
Убедитесь, что все службы изRequires=иAfter=уже активны (systemctl status <dependent_service>). Возможно, нужно изменить порядок или добавитьWants=вместоRequires=, если зависимость не критична. - Если проблема в
ExecStartPre=(например, ожидание сети), можно:- Исправить сам скрипт, добавив таймаут (
timeout 30s <command>). - Убрать тяжёлую проверку из
ExecStartPre=и перенести её в основной процесс службы, который уже будет иметь свой таймаут.
- Исправить сам скрипт, добавив таймаут (
Профилактика
- Оптимизируйте старт приложения. Разделите тяжёлую инициализацию на асинхронную (загрузка кэша в фоне после старта) и синхронную (только критичные для работы шаги).
- Правильно выбирайте
Type=. Изучайте документацию вашего ПО. Для современных приложений часто требуетсяType=notify. - Устанавливайте адекватный
TimeoutStartSec. Для простых веб-серверов 30-60 секунд обычно достаточно. Для сложных приложений (Java, базы данных) может потребоваться 120-300 секунд. Указывайте явно в юните, а не полагайтесь на значение по умолчанию. - Используйте
Restart=on-failure. Это не решит таймаут, но поможет службе автоматически перезапуститься после временного сбоя, не требующего вмешательства администратора. - Мониторьте логи. Настройте алерты на
systemctl statusс состояниемfailedили на частые сообщенияTimed out startingвjournalctl.
Статья подготовлена экспертами FixPedia. Если вы столкнулись с другими ошибками systemd, посмотрите наши руководства по диагностике через journalctl или управлению службами systemctl. Для ошибок, связанных с зависанием системы, см. справку по systemd-analyze.