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

1 ubuntu node.js 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
Run Code Online (Sandbox Code Playgroud)

这是来自 /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'.
Run Code Online (Sandbox Code Playgroud)

我一生都无法弄清楚为什么它抱怨找不到文件。npm start 从同一工作目录工作得很好,没有问题。我是否缺少一些权限或+x或其他什么地方?

Pho*_*elf 12

由于可执行文件在没有环境的情况下运行,因此可能会发生此错误。

这是一个快速修复食谱

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

脚本文件

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

cd /absolute/path/to/my/project
export NODE_ENV=development
npm start
Run Code Online (Sandbox Code Playgroud)

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

chmod +x script.sh
Run Code Online (Sandbox Code Playgroud)

现在我们可以创建我们的服务(例如位于/etc/systemd/system/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
Run Code Online (Sandbox Code Playgroud)

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

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

故障排除(Ubuntu 18.04 LTS)

最近发生在我身上,由于某种原因 systemctl 无法有效地获取.bashrc错误,npm error does not exists这是一个帮助我解决问题的解决方法。

将script.sh文件的内容更改为以下内容

systemctl start my-project
systemctl enable my-project
Run Code Online (Sandbox Code Playgroud)

现在你的 npm 服务应该可以工作了。


该解决方案经过测试:

  • Ubuntu 20.04 LTS,通过 NVM(节点版本管理器)安装节点版本 14.16.0
  • Ubuntu 18.04 LTS,通过 NVM(节点版本管理器)安装节点版本 12.22.6
  • CentOS 7,通过 NVM(节点版本管理器)安装节点版本 12.22.6