У меня есть простая служба systemd, которую нужно периодически перезапускать, чтобы не допустить, чтобы ее процесс был отключен. Есть ли опция конфигурации для системных служб для их периодического перезапуска? Все Restart*
options, похоже, относятся к перезапуску службы при ее выходе.
Как настроить периодическую перезагрузку службы systemd?
Ответ 1
Да, вы можете периодически обновлять свою службу, предоставляя услугу Type=notify
.
Добавьте этот параметр в раздел [Сервис] вашего файла службы вместе с Restart=always
и укажите WatchdogSec=xx
, где xx - это период времени, в течение которого вы хотите перезапустить службу. Здесь ваш процесс будет убит systemd через xx период времени и снова будет перезапущен systemd.
например,
[Unit]
.
.
[Service]
Type=notify
.
.
WatchdogSec=10
Restart=always
.
.
[Install]
WantedBy= ....
Ответ 2
Возможно, этого не было в то время, когда был задан вопрос, но теперь есть опция RuntimeMaxSec
, которая останавливает службу после того, как она была запущена в течение заданного периода времени.
например
[Service]
Restart=always
RuntimeMaxSec=604800
Мне это кажется более элегантным, чем злоупотребление Type=notify
и WatchdogSec
.
Ответ 3
Я видел решение здесь, что, казалось, элегантными, если немного окольным. Основная идея заключается в создании одноразовой службы, запускаемой таймером, который перезапускает другую службу.
Для таймера:
[Unit]
Description=Do something daily
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
Для одноразового обслуживания:
[Unit]
Description=Restart service
[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl try-restart my_program.service
Для одноразового обслуживания в Ubuntu 16.04 LTS:
[Unit]
Description=Restart service
[Service]
Type=oneshot
ExecStart=/bin/systemctl try-restart my_program.service
Это решение позволяет использовать системные таймеры, в том числе возможность перезапуска службы в определенное время суток, а не только по истечении некоторого времени.
Ответ 4
Как насчет crontab как
30 3 * * sun /bin/systemctl restart yourService
который бы перезапустил службу yourService в 3:30 каждое воскресенье.
Ответ 5
Просто несколько альтернативных подходов к достижению одной цели:
- если у вас есть контроль над реализацией службы, вы можете заставить ее закончить добровольно через какое-то время, например, либо просто выйти после определенного количества итераций (если применимо), либо использовать таймер тайм-аута с самим обработчиком sendin SIGTERM/SIGKILL
- Если окончание добровольной службы нецелесообразно/практично, вы можете иметь небольшой script на основе cron, убивающий сервисный процесс.
Ответ 6
Хотел прокомментировать
[Service]
Restart=always
RuntimeMaxSec=604800
ответ выше, но не могу больше очков.
Комментарий заключается в том, что это решение будет вызывать обработку ошибок, установленную OnFailure=failure_handling.service
. Так как запланированный перезапуск не является реальным сбоем, любое ведение журнала, уведомлений и т.д. Из службы обработки сбоев будет нежелательным и, вероятно, разрушительным.
Фактический периодический перезапуск был бы разумной особенностью для systemd, но я не задерживаю дыхание.