Restart*
选项似乎都与在服务退出时重新启动服务有关。Restart*
选项似乎都与在服务退出时重新启动服务有关。对于systemd版本>= 229,有一个名为RuntimeMaxSec
的选项,它会在服务运行一定时间后终止该服务。
例如,每7天重新启动:
[Service]
Restart=always
RuntimeMaxSec=7d
在我看来,这比滥用Type=notify
和WatchdogSec
要更加优雅。
systemd提供了一种干净的方法来添加和覆盖供应商提供的systemd单元文件中的指令。Drop-In Units在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"。systemctl --version
查看您的版本。 - HilikusRuntimeMaxSec=7d
。 - Cameron Tacklindsystemctl restart foo
不是必要的。当我运行 daemon-reload
时,它已经自动重新启动了,因为进程的运行时间已经超过了最大值。 - Chad如何使用crontab。示例:
30 3 * * sun /bin/systemctl restart yourService
这将会在每个星期天的凌晨3点30分重启名为yourService
的服务。
如果您希望在任何类Unix服务器上都能正常工作(例如,您不想担心特定的systemd版本等),您可能会喜欢这个解决方案。
try-restart
命令。请参阅https://www.man7.org/linux/man-pages/man1/systemctl.1.html。 - JN01我看到了一个解决方案在这里,它似乎很优雅,如果有些绕。关键的想法是创建一个由计时器触发的一次性服务,该服务重新启动另一个服务。
对于计时器:
[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的定时器功能,包括在特定时间重启服务,而不仅是在经过一段时间后重启。
weeklyRestart.service
和weeklyRestart.timer
。当我解决这个问题时,我查阅了很多链接。如果需要,可以私信给我,我会发送链接列表。 - matmatUnit=
指定另一个服务。 - Chris DownPersistent=true
?如果重新启动服务是这里的目的,并且由于服务器离线而定时器未运行,则服务将被重启。 - Dominik是的,你可以通过将你的服务设置为Type=notify
来定期重启它。
在你的服务文件的[Service]部分中加入这个选项,同时添加Restart=always
和WatchdogSec=xx
,其中xx是以秒为单位的重启时间间隔。在这里,systemd会在xx时间段后杀掉你的进程,并由systemd重新启动。
[Unit]
.
.
[Service]
Type=notify
.
.
WatchdogSec=10
Restart=always
.
.
[Install]
WantedBy= ....
Type=notify
不能使服务启动,Type=simple
很好用(实际上没有任何Type
也可以正常工作,可能简单模式是默认的Type
)。 - WonderLandType=notify
。这样的服务单元已经在使用Type=notify
。对于不与systemd通信的服务使用它将导致启动失败。 - Michael Hampton[Service]
Restart=always
RuntimeMaxSec=604800
虽然上面有答案,但是没有更多的信息不能解决问题。
我的评论是,这个解决方案将调用由OnFailure=failure_handling.service
设置的故障处理。由于定期重启不是真正的故障,因此来自故障处理服务的任何日志记录、通知等都是不需要的,可能会干扰。
实际的定期重启对于systemd来说是一个明智的功能,但我不会抱太大希望。
以下是一些达到相同目标的替代方法:
针对systemd版本>=229的复制粘贴解决方案:
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.
systemd
标签表示编写单元文件的问题最好在unix.SE上提问。 - wes