将 PATH 变量导入到 systemd 单元

将 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

我的用户名为kennykenny有一个名为“installed”的工具nvm来管理版本。该工具通过编辑“~/.bashrc”nodejs将目录添加到环境变量中。PATH

这意味着yarn仅当用户以 身份登录时该命令才可用kenny

我留下的印象是,如果我将systemd'sunit的用户设置为 'kenny',systemd将会处理好剩下的事情,或者我不知道我在想什么。

有什么方法可以将kennyPATH 变量导入到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

相关内容