Подтвердить что ты не робот

Как настроить периодическую перезагрузку службы systemd?

У меня есть простая служба systemd, которую нужно периодически перезапускать, чтобы не допустить, чтобы ее процесс был отключен. Есть ли опция конфигурации для системных служб для их периодического перезапуска? Все Restart* options, похоже, относятся к перезапуску службы при ее выходе.

4b9b3361

Ответ 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, но я не задерживаю дыхание.