У меня есть служба 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