Назад | Перейти на главную страницу

Импортировать переменную PATH в модуль systemd

У меня есть служба systemd, которая выглядит так:

[Unit]
Description=Kcrypt Backend Webpack Bundler
After=network.target

[Service]
User=kenny
Environment=NODE_ENV=PROD
WorkingDirectory=/var/www/kcrypt-api/
ExecStart=/var/www/kcrypt-api/scripts/webpack.sh

[Install]
WantedBy=multi-user.target

Файл .sh выглядит так:

#!/usr/bin/env bash

export NODE_ENV=DEV

rm ./dist/* -rf

yarn start webpack --watch 

Проблема в том, что он не может найти yarn.

Мой пользователь называется kenny. kenny есть инструмент под названием nvm установлен, который управляет nodejs версии. Этот инструмент добавляет каталог в PATH env, отредактировав '~ / .bashrc'.

Это означает, что yarn команда доступна только в том случае, если пользователь вошел в систему как kenny.

У меня создалось впечатление, что если я установил systemdс unitпользователь "kenny", systemd обо всем остальном позаботится, или я не знаю, о чем я думал.

Есть ли способ импортировать kennyпеременную PATH в systemd unit?

Вместо того, чтобы ссылаться на пользователя PATH переменная ', вы должны либо определить PATH вручную или, что более уместно, используйте полный путь к двоичному файлу.

Это означает, что команда yarn доступна только в том случае, если пользователь вошел в систему как kenny

Это не совсем так. Это просто означает, что yarn не установлен в месте, указанном в PATH переменная, используемая systemd, и, вероятно, находится в настраиваемом месте или месте за пределами переменной PATH по умолчанию.

Когда вы вошли как kenny, используйте which yarn напечатать путь к yarn, затем обязательно используйте это при ссылке на него в скрипте.

bash будет только источником ~/.bashrc если вы запускаете его как интерактивную оболочку, этого не произойдет, если вы просто запускаете bash для скрипта.

Учитывая, что systemd запускает только bash в качестве интерпретатора webpack.sh script (на самом деле, он даже не знает, что задействован bash, ядро ​​выполняет его как интерпретатор из строки #!), то это не интерактивная оболочка, и файлы запуска не читаются.

Вы можете обойти это, выбрав ~/.bashrc явно в начале вашего webpack.sh сценарий, предполагая, что все внутри безопасно для запуска в неинтерактивной оболочке. (Все должно быть хорошо.)

Поэтому рассмотрите возможность добавления этой строки в начало вашего скрипта:

. ~/.bashrc