我有一个简单的systemd服务需要定期重新启动,以防止其进程被淘汰。是否有系统服务的配置选项可以定期重启它们?所有Restart*
options似乎都与退出时重新启动服务有关。
答案 0 :(得分:39)
在提出问题时可能不会出现此问题,但现在有一个名为RuntimeMaxSec
的选项,它会在服务运行一段时间后终止服务。
e.g。
[Service]
Restart=always
RuntimeMaxSec=604800
对我而言,这似乎比滥用Type=notify
和WatchdogSec
更优雅。
答案 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)
最终达到同一目标的另一种方法是:
答案 5 :(得分:1)
想对
发表评论[Service]
Restart=always
RuntimeMaxSec=604800
上面的答案,但没有更多的分数。
注释:此解决方案将调用OnFailure=failure_handling.service
设置的故障处理。由于计划的重新启动并不是真正的失败,因此来自失败处理服务的任何日志记录,通知等都是不必要的,并且可能会造成破坏。
对于systemd来说,实际的定期重新启动将是一项明智的功能,但我不会屏息。