如果网络连接断开,则重新启动 systemd 服务
Posted
技术标签:
【中文标题】如果网络连接断开,则重新启动 systemd 服务【英文标题】:restart systemd service if network connection is down 【发布时间】:2018-07-19 05:31:12 【问题描述】:我将此单元文件作为 systemd 服务运行。它基本上启动了在本地网络上的 Raspberry Pi 上运行的 Nodejs Express 应用程序。该应用程序运行良好,但如果由于某种原因路由器或网络出现故障并再次备份,该应用程序将停止侦听,我必须重新启动 systemd 服务才能使其再次运行。
[Unit]
Description=Employee Manager PiClock VueJs App
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/home/pi/.nvm/versions/node/v8.9.4/bin/node /home/pi/employee-manager-app/vuejs-app-server/app.js
User=pi
Restart=always
# Restart service after 2 seconds if node service crashes
RestartSec=2
[Install]
WantedBy=multi-user.target
如果网络再次出现故障,是否有办法自动重新启动服务?
【问题讨论】:
我通过检测应用程序中的网络断开解决了这个问题。发生这种情况时,您可以从 app.js 调用process.exit()
并将其留给 systemd 以重新启动服务,然后您的应用将再次连接到网络.并尽可能多地尝试实现干净的退出。
【参考方案1】:
Systemd 目标仅到达一次,并且在连接状态更改时不会再次触发。根据您的网络管理方式,有几个选项:
如果您已经在使用 NetworkManager,您可以使用它的 dispatcher scripts 来触发网络变化。
如果您使用 systemd-networkd,您也许可以使用以类似方式工作的networkd-dispatcher 。
对于 netctl,您可以在界面恢复时使用 netctl hooks。
wicd 以及许多其他的具有类似功能,但据我所知 systemd 缺乏自己的持久网络监控。
【讨论】:
【参考方案2】:在Fedora 24 through 28 上,您可以在[Unit]
部分中使用BindsTo=network.service
。
[Unit]
Description=Employee Manager PiClock VueJs App
Wants=network-online.target
After=network-online.target
BindsTo=network.service
更多信息,请阅读systemd.unit 的手册页。
【讨论】:
没有network.service
,它是一个目标。绑定到 systemd-networkd.service 在较长的网络中断时无法可靠地工作。
有network.service
,至少在 CentOS 机器上。它由systemd-generator
到/etc/init.d/network
生成。以上是关于如果网络连接断开,则重新启动 systemd 服务的主要内容,如果未能解决你的问题,请参考以下文章