Сегодня будем убивать неугодные сервисы. Нет, тут будет не про kill и т. п., а будет все тот же systemd.
Короче в юните можно указать параметр RuntimeMaxSec, в нем задаём время жизни сервиса. Если сервис работает дольше указанного времени, то ему песда. Systemd принудительно завершит его.
Удобно применять для сервисов, которые не должны жить вечно. Нет ничего вечного! Например, временные задачи, вспомогательные демоны, скрипты и т.п.
[Service]
RuntimeMaxSec=30s
0s, 5min, 1h, 2d — интервалы
infinity — отключение лимита
А что будет, если время вышло?
Как и написал выше — будет песда! Systemd пошлет SIGTERM. А если сервис, сука, живучий и не завершился, то в ход пойдет тяжелая артиллерия через TimeoutStopSec, тут уже будет послан SIGKILL. Но его нужно предварительно прописать.
TimeoutStopSec= — это время ожидания корректного завершения сервиса после того, как systemd послал ему сигнал SIGTERM.
[Service]
ExecStart=/usr/bin/python3 /opt/scripts/bashdays-task.py
RuntimeMaxSec=60
Этот сервис будет убит через 60 секунд после запуска — даже если скрипт ещё не завершился.
[Service]
ExecStart=/usr/bin/bashdays-daemon
RuntimeMaxSec=60
TimeoutStopSec=10
Если bashdays-daemon работает дольше 60 секунд → SIGTERM
Ждём до 10 секунд → если не завершился → SIGKILL
Частый паттерн
RuntimeMaxSec=300
TimeoutStopSec=5
Restart=on-failure
systemd подождёт 5 секунд на аккуратное завершение, а потом прибьёт его нахуй.А нахуя тут Restart=on-failure?
Оно говорит — «если сервис завершился аварийно — перезапусти его». А завершение по SIGKILL из-за превышения времени жизни это и есть failure.
Если не указать TimeoutStopSec, будет использоваться значение по умолчанию: 90 секунд — порой это дохуя, поэтому предпочтительнее задать его руками.
Важный нюанс!
Если в юните используется Restart=always, то после убийства, сервис будет перезапущен и, возможно, сразу «помрёт», если не изменит своё поведение.
Такие дела, изучай!








Комментарии