如何解决从Systemctl服务文件中的ExecStart运行npm start
[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某处?
解决方法
这个错误可能是由于可执行文件是在没有环境的情况下运行的。
这是一个快速修复配方
您可以通过创建 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。