Upstart - 加载 bashrc 变量

Upstart - 加载 bashrc 变量

我想知道如何bashrc在新贵脚本中加载变量并运行(node.js在这种情况下是服务器)。

最好的方法是什么?

我试过这个:

exec sudo -u someuser $NODE_PATH $FULL_PATH/$FILE_NAME >> /var/log/$PROGRAM_NAME.sys.log 2>&1

和这个

exec start-stop-daemon --start -c someuser --exec $NODE_PATH $FULL_PATH/$FILE_NAME >> /var/log/$PROGRAM_NAME.sys.log 2>&1

但在第一个选项中,节点应用程序无法读取http_proxy变量(在 中定义/etc/bash.bashrc)。在第二个中,它无法读取配置文件(节点应用程序安装在该/opt文件夹中)

答案1

/etc/bash.bashrc交互式 shell 启动时会读取它们。这是用于交互使用的设置的地方,例如完成设置、提示等。请勿在那里设置环境变量。看是否有一个所有 shell 都能读取的“.bashrc”等效文件?系统范围环境变量的好地方是/etc/environment/etc/profile(以及 中的文件/etc/profile.d)。

正常的新贵设置环境变量的方法位于作业文件本身中。 Upstart 不会读取/etc/environment,但您可以从作业脚本中的文件加载环境变量:

script
. /etc/environment
exec start-stop-daemon …
end script

答案2

您可以通过欺骗它认为它被调用来强制bash读取/etc/bash.bashrcand ~/.bashrc(没有使用的其他副作用) :bash -issh

sudo -Hu someuser env SSH_CLIENT=1 SHLVL=0 \
  "NODE_PATH=$NODE_PATH" "FULL_PATH=$FULL_PATH" \
  "FILE_NAME=$FILE_NAME" "PROGRAM_NAME=$PROGRAM_NAME" bash -c '
  "$NODE_PATH" "$FULL_PATH/$FILE_NAME" >> "/var/log/$PROGRAM_NAME.sys.log" 2>&1'

sudo通常会重置环境,因此您需要通过这种方式。您想要-H(或者-i虽然-i会导致读取配置文件)以便设置(至少HOME对于位置)。~/.bashrc

答案3

您可以强制bash作为交互式 shell 执行。尝试这个命令:

sudo -iu someuser /bin/bash -i -c '$NODE_PATH $FULL_PATH/$FILE_NAME \
>> /var/log/$PROGRAM_NAME.sys.log 2>&1'

现在,在执行您的命令之前,~/.bashrc并且/etc/bash.bashrc来源为bash.这与打开终端时的行为相同。

相关内容