Промежутки времени в unit-файле разбираются не так
Параметры времени принимают число с единицей: 30s, 5min, 2h. Без единицы число читается как секунды — поэтому RestartSec=100 это сто секунд, а не сто миллисекунд, как многие думают.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Единица не указана
Число без единицы — секунды. Ожидание миллисекунд приводит к паузам в сотни раз больше задуманного.
-
Недопустимая запись единицы
Допустимы us, ms, s, min, h, d, w и словесные варианты. Записи вроде
30 seconds.или1,5minне разбираются. -
Ноль вместо бесконечности
У таймаутов ноль означает отключение ограничения, а не мгновенное истечение. Читается это неочевидно и часто понимается наоборот.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Все промежутки времени в микросекундах: видно фактические значения.
systemctl show myapp.service | grep -i USecНеразбираемые записи времени.
systemd-analyze verify /etc/systemd/system/myapp.serviceРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Число без единицы — секунды. Ожидание миллисекунд приводит к паузам в сотни раз больше задуманного.
- Как проверить
-
Посмотрите действующие значения: systemd печатает их в микросекундах.
systemctl show myapp.service | grep -iE "Sec=|USec="
- Как исправить
-
Указывайте единицу всегда:
RestartSec=100msилиRestartSec=5s. Так файл читается однозначно.
- Почему происходит
- Допустимы us, ms, s, min, h, d, w и словесные варианты. Записи вроде
30 seconds.или1,5minне разбираются.
- Как проверить
-
Проверьте файл статической проверкой.
systemd-analyze verify /etc/systemd/system/myapp.service
- Как исправить
-
Исправьте по сообщению проверки. Составные записи допустимы:
1min 30s.
- Почему происходит
- У таймаутов ноль означает отключение ограничения, а не мгновенное истечение. Читается это неочевидно и часто понимается наоборот.
- Как проверить
-
Поищите нулевые значения.
systemctl show myapp.service | grep -E "USec=0$|Sec=0$"
- Как исправить
-
Пишите
infinity, если ограничение не нужно: смысл будет понятен любому, кто откроет файл.
Пример вывода
Пауза оказалась в сто секунд вместо ста миллисекунд. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ systemctl cat myapp.service | grep RestartSec
RestartSec=100
$ systemctl show myapp.service -p RestartUSec
RestartUSec=1min 40s
Связанные ошибки
- Failed with result 'timeout' Состояние timeout: служба не уложилась в отведённое время при запуске, остановке или перезагрузке настроек.
- Unit file is bad и ошибки разбора unit-файла systemd не может разобрать unit-файл: неизвестные параметры, ошибки в секциях, недопустимые значения. Как найти проблемную строку.
- start-limit-hit: служба заблокирована после серии перезапусков Состояние start-limit-hit и сообщение start request repeated too quickly: systemd перестал перезапускать службу. Как разблокировать и найти исходную причину.
- A start job is running: загрузка висит на одной службе Загрузка останавливается с обратным отсчётом: служба не укладывается в таймаут. Как найти виновника и не ждать.
- A stop job is running: выключение висит Перезагрузка останавливается с обратным отсчётом: служба не завершается. Как найти и сократить ожидание.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Apache: правила .htaccess не действуют Файл .htaccess игнорируется: запрещён параметром AllowOverride, нет нужного модуля, файл не читается.
- Configuration file is marked world-inaccessible Предупреждение о правах на unit-файл: служба работает, но файл недоступен для чтения другим.
Источники
-
systemd.time(7)
Форматы промежутков времени и допустимые единицы. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено: RestartSec=100 даёт паузу в сто секунд.