TimeoutStartSec=: сколько systemd ждёт запуска службы
Задаёт, сколько systemd ждёт признания службы запущенной. По истечении срока запуск считается неудачным, а процессам посылается сигнал завершения.
Что делает
Что именно считается «запущенной», зависит от Type=. Для simple это почти мгновенно, для forking — завершение исходного процесса, для notify — уведомление от программы. Поэтому таймаут запуска и тип надо рассматривать вместе: чаще всего таймаут истекает не потому, что служба медленная, а потому что тип выбран неверно.
Значение infinity снимает ограничение. Это допустимо для служб, где время восстановления непредсказуемо (большие базы), но тогда подвисший запуск будет держать задание вечно и блокировать зависимые службы.
Где ставится. В секции [Service]. Параметр TimeoutSec= задаёт сразу и запуск, и остановку.
Значения
| Значение | Что происходит |
|---|---|
90s | значение по умолчанию в большинстве дистрибутивов. |
10min | для баз данных с восстановлением по журналу транзакций. |
infinity | ограничение снято; применять осознанно. |
0 | читается неочевидно: означает отключение ограничения. Лучше писать infinity. |
По умолчанию: обычно 90s, задаётся DefaultTimeoutStartSec= в system.conf
Пример
Увеличенный таймаут для медленно стартующей службы.
[Service]
Type=notify
TimeoutStartSec=10min
ExecStart=/usr/lib/postgresql/16/bin/postgres -D /var/lib/postgresql/16/main
Для базы это оправданно: восстановление после аварийного завершения занимает минуты, а обрыв на середине только удлиняет следующую попытку.
Типичные ошибки
Таймаут при Type=notify почти всегда означает, что программа не умеет отчитываться о готовности, а не что она медленная.
Значение 0 часто понимают как «без ожидания», хотя оно отключает ограничение. Пишите infinity.
Предварительные команды (ExecStartPre=) входят в этот же таймаут.
Увеличение таймаута не лечит заблокированный запуск: служба, ждущая недоступную зависимость, не запустится и за час.
Связанные ошибки
- Failed with result 'timeout'Состояние timeout: служба не уложилась в отведённое время при запуске, остановке или перезагрузке настроек.
- Job for … failed because a timeout was exceededЗадание на запуск прервано по таймауту. Как отличить медленный старт от заблокированного и правильно настроить TimeoutStartSec.
- Failed with result 'protocol'Состояние protocol: служба нарушила договор со systemd. Обычно Type=notify без уведомления или Type=dbus без имени на шине.
Рядом стоящие параметры
Где важен на практике
Источники
- systemd.service(5)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)