如果网络连接断开,则重新启动 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 服务的主要内容,如果未能解决你的问题,请参考以下文章

宽带连接已断开连接怎么回事?

PHP 如果断开连接则重新连接的mysql连接

启动uboot后,网线断开

如果已断开连接,则重新连接的mysql连接

C# TcpListener如何知道客户端已经断开连接

为啥有的软件安装需要断开网络,比如ps6?