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

myN*_*unt 0 linux node.js systemd npm

环境: CentOS 8、Node.js、Digital Ocean Droplet

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

$ sudo systemctl start myapp
Run Code Online (Sandbox Code Playgroud)

文件 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
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/sh
/usr/bin/node /srv/myapp/app.js
Run Code Online (Sandbox Code Playgroud)

但是,当我不使用 Systemd 时,我通常会使用命令npm start. 我宁愿让 Systemd 单元也用npm start.

不幸的是扔了一个错误,当我换app.jsnpm start/root/start-myapp.sh

/usr/bin/node /srv/myapp/npm start
Run Code Online (Sandbox Code Playgroud)

我通过从切换路径作了一次尝试nodenpm,但它产生的同样的错误。

/usr/bin/npm /srv/myapp/npm start
Run Code Online (Sandbox Code Playgroud)

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

小智 6

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

...

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

...
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!