监视 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
进行创建、启用和启动符号链接的相同操作。
得出一个结论
被反映了。
个人感受
我认为在这里应该进行设置日志等实用的部署。由于我理解较浅,请多多指教。
请参考