![如何配置 Systemd 服务单元以使用“npm start”而不是“app.js”启动 Node 应用程序](https://linux22.com/image/752962/%E5%A6%82%E4%BD%95%E9%85%8D%E7%BD%AE%20Systemd%20%E6%9C%8D%E5%8A%A1%E5%8D%95%E5%85%83%E4%BB%A5%E4%BD%BF%E7%94%A8%E2%80%9Cnpm%20start%E2%80%9D%E8%80%8C%E4%B8%8D%E6%98%AF%E2%80%9Capp.js%E2%80%9D%E5%90%AF%E5%8A%A8%20Node%20%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F.png)
环境: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
我再次尝试将路径从 切换为,node
但npm
仍然产生相同的错误。
/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 start
npm 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:也许我来晚了?已经两年了……