Как загрузить переменные PATH при запуске процесса узла с помощью systemctl? - PullRequest
0 голосов
/ 21 января 2019

Некоторые предыстории:
У меня есть веб-приложение, работающее на роботе.Это веб-приложение - node.js для API / http-сервера, React построен с веб-пакетом на передней панели.Он взаимодействует с ядром AWS IoT для выполнения заданий, обновлений и т. Д. Эта часть работает нормально.Приложение открывается в Chrome в режиме киоска при включении робота.Для этого у меня есть служба systemctl, которая запускает скрипт узла, который запускает все.

Проблема :
У меня есть задание, которое я создаю в AWS IoT Core, которое мое приложениенаблюдает за.Он предназначен для обновлений программного обеспечения (особенно для создания внешнего интерфейса приложения).Приложение понимает, что есть новое задание для выполнения, и загружает файл с именем deploy.sh, а затем пытается выполнить его, запустив bash deploy.sh.Связь с IoT в порядке - он успешно загружает его и пытается запустить.Проблема в том, что он не выполняется.Вот как выглядит скрипт:

#!/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.Это также дает мне это сообщение об ошибке об узле 4.2.6, поэтому я ЗНАЮ, что он не загружает правильное.У меня 8.11.1 установлен с помощью nvm.Вот сценарий из моего package.json:

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

env.mode production - это все, что используется веб-пакетом и работает.

TL; DR
Когда я запускаю yarn build из моего скрипта, он не может найти двоичный файл веб-пакета - другими словами, когда я запускаю скрипт npm (веб-пакет) из моего package.json из скрипта, который я скачал во время запуска процесса узлас systemctl - он не может разрешить пути.

То, что я пробовал:

  • глобальная установка веб-пакета
  • используя ./deploy.sh вместо bash deploy.sh
  • sourcing .bashrc в моем сценарии
  • , изменяя мои сценарии package.json для использования абсолютных путей к каталогу node_modules / .bin
  • вызов bash deploy.sh прямо из командной строки - это прекрасно работает.Это только когда я вызываю его с узла, процесс запускается с systemctl.Если я запускаю узел, набирая node app.js, то он работает.

Моя информация:

  • ОС: Ubuntu 16.04.5LTS
  • Узел: v8.11.1
...