如何配置 Systemd 服务单元以使用“npm start”而不是“app.js”启动 Node 应用程序

如何配置 Systemd 服务单元以使用“npm start”而不是“app.js”启动 Node 应用程序

环境:CentOS 8、Node.js、数字海洋水滴

我的 Systemd 设置使用以下命令启动节点应用程序。它按预期工作。

$ sudo systemctl start myapp

文件 1:/etc/systemd/system/myapp.service

[Unit]
Description = My App 
After = network.target

[Service]
ExecStart = /root/start-myapp.sh
Restart=on-failure

[Install]
WantedBy = multi-user.target

文件 2:/root/start-myapp.sh

#!/bin/sh
/usr/bin/node /srv/myapp/app.js

但是当我不使用 Systemd 时,我通常使用命令 通过 Node 包管理器启动我的应用程序。npm start我宁愿让 Systemd 单元也使用 启动应用程序npm start

app.js不幸的是,当我改为npm start时它抛出了一个错误/root/start-myapp.sh

/usr/bin/node /srv/myapp/npm start

我再次尝试将路径从 切换为,nodenpm仍然产生相同的错误。

/usr/bin/npm /srv/myapp/npm start

问题:如何使用命令让 Systemd 单元文件启动我的应用程序npm start

答案1

我在 Debian 上运行类似的设置,我的服务如下所示:

...

[Service]
Environment=NODE_PORT=3000
Type=simple
User=www-data
Restart=on-failure
WorkingDirectory=/var/www/<your-code-directory>
ExecStart=npm start

...

希望这可以帮助!

答案2

我对 filipe 的回答不太满意,但我发现这个非常接近了!

[Unit]
Description=My application

[Service]
Type=simple
Restart=always
User=nobody
Group=nobody
WorkingDirectory=/opt/myapplication
ExecStart=/usr/bin/npm start

[Install]
WantedBy=multi-user.target

主要区别在于前面ExecStart有。另一个区别是它排除了环境,我在我的环境中添加了一个端口标志,因此/usr/bin/npm startnpm start --Port 5000

我还发现如果您像我一样对服务设置非常陌生,那么这是一篇有用的文章。

它没有涵盖这个问题但是确实有一些其他有用的提示。

我也是使用 Centos 7

答案3

如果你手动执行 npm start 并检查 ps -ef | node,你会发现实际执行的是 node。Node 是唯一运行一切的可执行文件。我给你举个例子:

/home/ubuntu/.nvm/versions/node/v18.16.0/bin/node /home/ubuntu/aiphotoviewer/node_modules/.bin/next start

您的节点将位于另一个位置,但概念相同。只需 npm run,ps -ef | node 检查实际运行过程并复制它,您就可以开始了

希望有帮助。

PS:也许我来晚了?已经两年了……

相关内容