我有一个如下所示的 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
installed 的工具来管理nodejs
版本。该工具PATH
通过编辑“~/.bashrc”将目录添加到环境变量。
这意味着该yarn
命令仅在用户以kenny
.
我留下的印象是,如果我将systemd
' unit
s 用户设置为 'kenny',systemd
其余的会处理,或者我不知道我在想什么。
有什么方法可以将kenny
PATH 变量导入到systemd
unit
?
与其尝试“引用用户
PATH
变量”,不如PATH
手动定义,或者更恰当地说,使用二进制文件的完整路径。这是不准确的。这只是意味着它
yarn
没有安装在PATH
systemd 使用的变量引用的位置,并且可能在自定义位置或默认 PATH 变量之外的位置。当您以 身份登录时
kenny
,用于which yarn
打印 的路径yarn
,然后确保在脚本中引用它时使用该路径。bash 仅在您将其作为交互式 shell 运行时才会 source
~/.bashrc
,如果您只是为脚本运行 bash 则不会这样做。考虑到 systemd 只是运行 bash 作为
webpack.sh
脚本的解释器(实际上它甚至不知道涉及到 bash,内核从 #! 行作为解释器执行它),那么它就不是交互式 shell,也没有启动文件被读取。您可以通过在脚本
~/.bashrc
开头显式采购来解决此问题webpack.sh
,假设其中的所有内容都可以安全地在非交互式 shell 中运行。(应该没问题。)因此,请考虑将此行添加到脚本的开头: