从Systemctl服务文件中的ExecStart运行npm start

时间:2020-10-14 13:03:21

标签: node.js ubuntu npm systemctl

我有以下服务文件:

[Unit]
Description=MyApp
After=syslog.target network.target
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=always
RestartSec=1
WorkingDirectory=/opt/nodejs-sites/MyApp
ExecStart=/usr/bin/npm start
Environment=NODE_ENV=development
User=root
Group=root
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=MyApp

[Install]
WantedBy=multi-user.target

这是/ var / log / syslog中的错误

Oct 14 13:00:55 devu18 systemd[1]: Started myapp.
Oct 14 13:00:55 devu18 systemd[3203]: myapp.service: Changing to the requested working directory failed: No such file or directory
Oct 14 13:00:55 devu18 systemd[3203]: myapp.service: Failed at step CHDIR spawning /usr/bin/npm: No such file or directory
Oct 14 13:00:55 devu18 systemd[1]: myapp.service: Main process exited, code=exited, status=200/CHDIR
Oct 14 13:00:55 devu18 systemd[1]: myapp.service: Failed with result 'exit-code'.

我一生都无法弄清为什么它抱怨找不到文件。从同一工作目录启动npm可以正常工作,没有问题。我是否缺少某些权限或+ x某处?

1 个答案:

答案 0 :(得分:0)

这个错误可能是由于可执行文件是在没有环境的情况下运行的。

这是一个快速修复配方

您可以通过创建 Bash 脚本来完成您需要的一切来解决这个问题。

<块引用>

script.sh

#! /bin/bash
source ${HOME}/.bashrc

cd /absolute/path/to/my/project
export NODE_ENV=development
npm start

现在将其模式更改为可执行

chmod +x script.sh

现在我们可以创建我们的服务

<块引用>

my-project.service

[Unit]
Description=My Project
After=syslog.target network.target

[Service]
Type=simple
Restart=always
RestartSec=1
ExecStart=/path/to/my/script.sh
User=root

[Install]
WantedBy=multi-user.target

现在让我们运行它并启用它

systemctl start my-project
systemctl enable my-project

该解决方案在 Ubuntu 20.04 LTS 上进行了测试,通过 NVM(节点版本管理器)安装了节点版本 14.16.0