我想知道如何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.bashrc
and ~/.bashrc
(没有使用的其他副作用) :bash -i
ssh
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
.这与打开终端时的行为相同。