如何在不重新启动服务器的情况下在系统范围内获取新的环境变量?
由于它是 Ubuntu 11.x 服务器,我使用 Upstart 来启动/重新启动进程。
我向 /etc/environment 添加了一个新的环境变量,需要由我的一个应用程序进程获取该变量。
如果我直接从 shell 启动该进程,变量就会被拾取,一切正常(我已经为我的会话获取了 /etc/environment)。但是,当我使用其 Upstart 服务名称启动/重新启动该进程时,看不到该变量。
sudo start app-name
我很确定如果我重新启动服务器,新变量将被拾取,但我想尽量避免这种情况。我还有一些其他正在运行的进程,如果可能的话,我想避免中断它们。
答案1
这个问题似乎包含很多关于如何在 Upstart 脚本中处理环境变量的子问题,所以我想分享一些我为处理和测试 Upstart 和 Cron 环境所做的事情。
关于 Upstart 等,首先要知道的是,它不与你的活动终端共享相同的环境,因此类似于:
$ export FOO=bar
$ start upstart-name
不起作用,因为upstart-name
实际上不会看到FOO
您刚刚导出到当前 shell 中,因为 Upstart 在干净的环境中运行。
您可以使用这种方便的方法来模拟 Upstart (和 Cron)运行的干净环境,这种方法是我很久以前从另一个答案中抄袭来的:
# makes the current shell have an environment like cron or upstart
# http://stackoverflow.com/a/2546509/5006
function cronenv() {
cron_env+="HOME=$HOME\n"
cron_env+="LOGNAME=$LOGNAME\n"
cron_env+="PATH=/usr/bin:/bin\n"
cron_env+="SHELL=/bin/sh\n"
cron_env+="PWD=$PWD\n"
if [[ -n $LC_ALL ]]; then
cron_env+="LC_ALL=$LC_ALL\n"
fi
env - `echo -e $cron_env` /bin/sh
}
只需将其转储到你的.bash_profile
或类似的东西中,然后你就可以像 Upstart 一样运行命令:
$ cronenv
$ some/big/command --to --run --as --upstart
现在,让我们在我们的盒子上设置一个共享环境,我们将通过将环境变量放入/etc/profile.d/environ.sh
# /etc/profile.d/environ.sh
export FOO=bar
然后在我们的 Upstart 脚本中获取该脚本:
script
# source our common environment file
. /etc/profile.d/environ.sh
exec some/big/command --to --run --as --upstart
end script
现在,我们将能够在任何 shell 和任何 Upstart 脚本上“看到”我们的环境,这些脚本可以获取我们的公共文件(默认情况下,Ubuntu 上的 ssh 将从 中获取所有内容/etc/profile.d
)。耶!
答案2
将 env 节放入你的 upstart 作业描述文件中。
http://upstart.ubuntu.com/wiki/Stanzas#env
env PIDFILE=/var/run/myprocess.pid
或者其他什么。全部都在文档中。
答案3
我也遇到了同样的问题。我的启动脚本在命令行下运行良好,但在 upstart 脚本下却不行。
我只需在我的 upstart 脚本中输入源代码. /home/username/.bashrc
即可使其使用所有正确的环境变量。
script
cd /home/me
. /home/me/.bashrc
~/www/app/bin/server.production
end script