使用systemctl启动节点进程时如何加载PATH变量?

时间:2019-01-21 18:36:04

标签: node.js bash webpack aws-iot systemctl

某些背景
我有一个在机器人上运行的Web应用程序。这是一个Web应用程序-用于API / http服务器的nod​​e.js,React的前端是webpack。它与AWS IoT核心对接以运行作业,更新等。这部分工作正常。机器人开启后,该应用程序会在Chrome中以信息亭模式打开。为此,我有一个systemctl服务,该服务运行可启动所有内容的节点脚本。

问题
我有一个在我的应用程序正在监视的AWS IoT Core中创建的工作。它用于软件更新(尤其是构建应用程序的前端)。该应用程序意识到有一个新任务要执行,并下载一个名为deploy.sh的文件,然后尝试通过运行bash deploy.sh来执行它。与物联网的连接很好-它成功下载并尝试运行它。问题是它无法执行。脚本如下所示:

#!/bin/bash

APP_DIR=/homepath/to/the/app
GIT_URL=https://git/repo/link/to/project.git

# pull latest code
if [[ -e $APP_DIR ]]; then

    cd $APP_DIR
    git stash
    git pull $GIT_URL master
else
    git clone $GIT_URL $APP_DIR
    cd $APP_DIR
fi

# Install prod dependencies
yarn install --quiet --non-interactive > "/dev/null" 2>&1

# Build & Restart application
yarn build --quiet

git命令在这里可以正常工作,并下拉代码。结果如下:

Error: Command failed: bash deploy.sh
From https://git/repo/link/to/project.git
 * branch            master     -> FETCH_HEAD
warning You are using Node "4.2.6" which is not supported and may encounter bugs or unexpected behavior. Yarn supports the following semver range: "^4.8.0 || ^5.7.0 || ^6.2.2 || >=8.0.0"
warning package.json: No license field
error Couldn't find the binary npm run webpack

我知道问题在于,因为我正在使用systemctl启动节点服务器,因此它无法在PATH中找到所有命令,因为当我像node app.js一样启动它时,它就可以工作。它还给了我关于Node 4.2.6的错误消息,所以我知道它没有加载正确的消息。我已经使用nvm安装了8.11.1。这是我package.json中的脚本部分:

"scripts": {
    "webpack": "webpack",
    "build": "npm run webpack -- --env.mode production --env.presets clean"
}

env.mode production就是webpack使用的所有东西。

TL; DR
当我从脚本运行yarn build时,它找不到webpack二进制文件-换句话说,当我从package.json中运行的npm脚本(webpack)从节点过程中下载的脚本中运行时,始于systemctl-无法解析路径。

我尝试过的事情:

  • 全局安装webpack
  • 使用./deploy.sh代替bash deploy.sh
  • 在我的脚本中采购.bashrc
  • 更改我的package.json脚本以使用指向node_modules / .bin目录的绝对路径
  • 直接从命令行调用bash deploy.sh-效果很好。仅当我从以systemctl开始的节点进程中调用它时。如果我通过输入node app.js来启动节点,那么它将起作用。

我的信息:

  • 操作系统:Ubuntu 16.04.5 LTS
  • 节点:v8.11.1

0 个答案:

没有答案