【问题标题】:Running npm start from ExecStart in systemctl service file在 systemctl 服务文件中从 ExecStart 运行 npm start
【发布时间】:2021-01-28 21:28:43
【问题描述】:

我有以下服务文件:

[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 或某处?

【问题讨论】:

    标签: node.js ubuntu npm systemctl


    【解决方案1】:

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

    这是一个快速修复方法

    你可以通过创建一个 Bash 脚本来解决这个问题。

    script.sh

    #! /bin/bash
    source ${HOME}/.bashrc
    
    cd /absolute/path/to/my/project
    export NODE_ENV=development
    npm start
    

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

    chmod +x script.sh
    

    现在我们可以创建我们的服务(例如位于/etc/systemd/system/my-project.service

    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 18.04 LTS)

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

    script.sh文件的内容改为如下

    #! /bin/bash
    export NVM_DIR="$HOME/.nvm"
    [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
    [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
    
    cd /absolute/path/to/my/project
    export NODE_ENV=development
    npm start
    

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


    此解决方案已在:

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

    【讨论】:

    • 谢谢你这对我有用!我尝试了许多不同的配置 systemctl 的方法,并且效果很好。编辑:当我运行 systemctl status 时,它说 running 这给了我错误的希望。因为当我再次运行 systemctl status 时,它停止了。
    猜你喜欢
    • 2018-11-14
    • 2023-03-25
    • 1970-01-01
    • 2014-09-05
    • 2018-04-20
    • 2017-04-30
    • 2020-12-09
    • 2019-08-24
    • 2020-06-19
    相关资源
    最近更新 更多