【问题标题】:restart systemd service if network connection is down如果网络连接断开,则重新启动 systemd 服务
【发布时间】: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 以重新启动服务,然后您的应用将再次连接到网络.并尽可能多地尝试实现干净的退出。

标签: node.js linux networking service 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 生成。
    猜你喜欢
    • 1970-01-01
    • 2017-11-19
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 2022-08-18
    • 1970-01-01
    相关资源
    最近更新 更多