如何配置systemd服务以定期重启?

时间:2015-06-25 15:55:23

标签: linux service systemd

我有一个简单的systemd服务需要定期重新启动,以防止其进程被淘汰。是否有系统服务的配置选项可以定期重启它们?所有Restart* options似乎都与退出时重新启动服务有关。

6 个答案:

答案 0 :(得分:39)

在提出问题时可能不会出现此问题,但现在有一个名为RuntimeMaxSec的选项,它会在服务运行一段时间后终止服务。

e.g。

[Service]
Restart=always
RuntimeMaxSec=604800

对我而言,这似乎比滥用Type=notifyWatchdogSec更优雅。

答案 1 :(得分:27)

是的,您可以通过提供Type=notify服务来定期重新启动服务。 在服务文件的[Service]部分中添加此选项以及Restart=always并提供WatchdogSec=xx,其中xx是您想要重新启动服务的第二个时间段。在此处,您的进程将在xx时间段后被systemd杀死,并将再次由systemd重新启动。 例如。

[Unit]
.
.

[Service]
Type=notify
.
.
WatchdogSec=10
Restart=always
.
.

[Install]
WantedBy= ....

答案 2 :(得分:26)

我看到一个似乎优雅的解决方案here,如果有点迂回。关键的想法是创建一个由重启另一个服务的计时器触发的一次性服务。

对于计时器:

ID

对于一次性服务:

[Unit]
Description=Do something daily

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

对于Ubuntu 16.04 LTS上的一次性服务:

[Unit]
Description=Restart service

[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl try-restart my_program.service

此解决方案允许您利用systemd的计时器,包括在一天中的特定时间重新启动服务的能力,而不仅仅是在经过一段时间后。

答案 3 :(得分:11)

像crontab一样

30 3 * * sun /bin/systemctl restart yourService

将在每个星期天凌晨3:30重新启动服务。

答案 4 :(得分:3)

最终达到同一目标的另一种方法是:

  • 如果您可以控制服务实现,可以在一段时间后自动结束服务,例如,在一定次数的迭代(如果适用)之后退出或者使用带有处理程序的超时计时器发送自身SIGTERM / SIGKILL
  • 如果志愿服务结束不可行/不实用,您可以使用基于cron的小脚本来终止服务流程。

答案 5 :(得分:1)

想对

发表评论
[Service]
Restart=always
RuntimeMaxSec=604800

上面的答案,但没有更多的分数。

注释:此解决方案将调用OnFailure=failure_handling.service设置的故障处理。由于计划的重新启动并不是真正的失败,因此来自失败处理服务的任何日志记录,通知等都是不必要的,并且可能会造成破坏。

对于systemd来说,实际的定期重新启动将是一项明智的功能,但我不会屏息。