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