监视 Node.js 服务器文件并自动重新启动

这是我的首次投稿。
虽然可以选择使用forever,但我将使用systemd来完成。

目标、意图、用意、目的地

有一个使用git自动部署的Node服务器,我想在部署后自动重新启动它。

策略

    • systemdでサーバーをデーモン化

 

    systemd.pathを使ってファイル監視して更新されたら再起動

恶魔化

首先将服务器程序变为守护进程

[Unit]
Description=hogehoge

[Service]
User=user_name
WorkingDirectory=/{サーバーまでのパス}/
ExecStart=/{nodeのパス}/node server.js
Restart=always

[Install]
WantedBy=multi-user.target

在systemd的目录中创建一个符号链接并启用、启动服务。

ln -s /home/user_name/systemd/my_server.service /etc/systemd/system/my_server.service
systemctl enable my_service.service
systemctl restart my_service.service

这个文件可以直接放在/etc/systemd/system/目录下,但是我不想频繁使用root权限,所以这次将其放在家目录下。

使用这个方法,Node.js服务器已经被设定为守护进程,即使它停止也会自动重新启动。
接下来,我们将配置它来监视server.js并实现自动重新启动。

文件监视

可以通过{服务名称}.path来监视文件。如果指定的路径有变化,它会启动{服务名称}.service。然而,这里有一个陷阱。

[Unit]
Description=hogehoge

[Path]
PathChanged=/{サーバーまでのパス}/server.js

[Install]
WantedBy=multi-user.target

我想要启用和启动它。我以为这样my_server.service会重新启动,但无论我如何修改server.js,都不会生效。
经过调查,它只会对文件的更改作出“启动”反应,而不是重新启动。由于my_server.service已经处于活动状态,所以无法启动,也没有反映。

解决办法

在另外准备一个进行重新启动的服务。

[Unit]
Description=hogehoge

[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl restart my_server.service

[Install]
WantedBy=multi-user.target

当此服务启动时,它将重新启动my_server.service。然后,通过文件监视来启动此服务。

[Unit]
Description=hogehoge

[Path]
PathChanged=/{サーバーまでのパス}/server.js

[Install]
WantedBy=multi-user.target

进行创建、启用和启动符号链接的相同操作。

得出一个结论

被反映了。

个人感受

我认为在这里应该进行设置日志等实用的部署。由于我理解较浅,请多多指教。

请参考

 

广告
将在 10 秒后关闭
bannerAds