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`
crontab 怎么样(不需要 systemd 版本 229+)。示例:
30 3 * * sun /bin/systemctl try-restart yourService
这将在每周日凌晨 3:30 重新启动名为
yourService
的服务。
我在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 的计时器,包括在一天中的特定时间重新启动服务的能力,而不仅仅是在经过一段时间后重新启动服务。
Type=notify
来定期重新启动服务。 将此选项与
Restart=always
一起添加到服务文件的 [Service] 部分,并给出 WatchdogSec=xx
,其中 xx 是您要重新启动服务的时间段(以秒为单位)。这里你的进程将在 xx 时间段后被 systemd 杀死,并再次被 systemd 重新启动。
例如。[Unit]
.
.
[Service]
Type=notify
.
.
WatchdogSec=10
Restart=always
.
.
[Install]
WantedBy= ....
[Service]
Restart=always
RuntimeMaxSec=604800
回答上面但不能没有更多点。
注释是该解决方案将调用
OnFailure=failure_handling.service
设置的故障处理。由于计划的重新启动不是真正的故障,因此来自故障处理服务的任何日志记录、通知等都将是不需要的,并且可能会造成破坏。
实际的定期重启对于 systemd 来说是一个明智的功能,但我不会屏住呼吸。
如果您可以控制服务实现,则可以让它在一段时间后自动结束,例如,在一定次数的迭代后直接退出(如果适用),或者使用带有处理程序的超时计时器,向自身发送 SIGTERM/SIGKILL
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.