如何配置 systemd 服务定期重启? [已关闭]

问题描述 投票:0回答:7

我有一个简单的 systemd 服务,需要定期重新启动以防止其进程出错。 systemd 服务是否有一个配置选项可以定期重新启动它们?所有

Restart*
选项似乎都与退出时重新启动服务有关。

linux service systemd restart
7个回答
243
投票

对于 systemd 版本 >= 229,有一个名为

RuntimeMaxSec
的选项,该选项会在服务运行指定时间后终止服务。

例如每 7 天重新启动一次:

[Service]
Restart=always
RuntimeMaxSec=7d

对我来说,这似乎比滥用

Type=notify
WatchdogSec
更优雅。

systemd 提供了一种在供应商提供的 systemd 单元文件中添加和覆盖指令的简洁方法。插入单元在 man systemd.unit 中描述。例如,如果您想定期重新启动包提供的 foo 服务,您可以创建一个名为

/etc/systemd/system/foo.service.d/periodic-restart.conf
.内容将如上所示。然后:

 systemctl daemon-reload
 systemctl restart foo

您可以确认 Drop-In 单元已加载,因为它将在状态输出中报告:

 systemctl status

最后,您可以通过搜索

systemctl show
输出来确认该指令已包含:

 systemctl show foo.service | grep RuntimeMax

systemctl show
报告的指令将是“RuntimeMaxUSec`


68
投票

crontab 怎么样(不需要 systemd 版本 229+)。示例:

30 3 * * sun /bin/systemctl try-restart yourService

这将在每周日凌晨 3:30 重新启动名为

yourService
的服务。


60
投票

我在here看到了一个解决方案,虽然有点迂回,但看起来很优雅。关键思想是创建一个由计时器触发的一次性服务,该计时器会重新启动“另一个”服务。 对于计时器:

[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

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


55
投票
Type=notify

来定期重新启动服务。 将此选项与

Restart=always
一起添加到服务文件的 [Service] 部分,并给出
WatchdogSec=xx
,其中 xx 是您要重新启动服务的时间段(以秒为单位)。这里你的进程将在 xx 时间段后被 systemd 杀死,并再次被 systemd 重新启动。 例如。

[Unit] . . [Service] Type=notify . . WatchdogSec=10 Restart=always . . [Install] WantedBy= ....



7
投票

[Service] Restart=always RuntimeMaxSec=604800

回答上面但不能没有更多点。 

注释是该解决方案将调用

OnFailure=failure_handling.service

设置的故障处理。由于计划的重新启动不是真正的故障,因此来自故障处理服务的任何日志记录、通知等都将是不需要的,并且可能会造成破坏。


实际的定期重启对于 systemd 来说是一个明智的功能,但我不会屏住呼吸。


5
投票

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

1
投票

SERVICE="systemd-resolved.service" env SYSTEMD_EDITOR=tee sudo -E systemctl edit --system ${SERVICE} <<EOF [Service] Restart=always RuntimeMaxSec=7200 EOF sudo systemctl daemon-reload && sudo systemctl restart "${SERVICE}"

检查:

systemd-delta | grep ${SERVICE} # NOTE: property here must be requested with "U": RuntimeMaxUSec systemctl show ${SERVICE} --property=RuntimeMaxUSec

回滚:

SERVICE="systemd-resolved.service" sudo rm -r "/etc/systemd/system/${SERVICE}.d" sudo systemctl daemon-reload sudo systemctl restart ${SERVICE}

更优雅的是:

SERVICE="systemd-resolved.service" sudo systemctl set-property ${SERVICE} RuntimeMaxSec=7200

但由于某种原因它不起作用:

Failed to set unit properties on systemd-resolved.service: Cannot set property RuntimeMaxUSec, or unknown property.

© www.soinside.com 2019 - 2024. All rights reserved.