如何在不重新启动服务器的情况下获取系统范围内的新环境变量?
作为一个Ubuntu 11.x服务器,我正在使用Upstart来启动/重启进程.
我在/ etc / environment中添加了一个新的环境变量,需要通过我的某个应用程序进程获取.
如果我直接从我的shell启动进程,那么变量就被拾取并且一切正常(我已经为我的会话提供了/ etc / environment).但是,当我使用其Upstart服务名称启动/重新启动进程时,不会看到该变量.
sudo start app-name
我很确定,如果我重新启动服务器,新变量将被拾取,但我想尽量避免这种情况.我在其上运行了一些其他的实时进程,我希望尽可能避免中断.
这个问题似乎包含了很多关于如何在Upstart脚本中处理环境变量的子问题,所以我想我会分享一些事情来处理和测试Upstart和Cron的环境.
原文链接:https://www.f2er.com/ubuntu/348569.html关于Upstart等的第一件事就是它与你的活动终端没有共享相同的环境,所以类似于:
$export FOO=bar $start upstart-name
不起作用,因为upstart-name实际上不会看到刚刚导出到当前shell的FOO,因为Upstart在干净的环境中运行.
您可以模仿Upstart(和Cron)使用这个方便的方法运行的干净环境,这个方法是我在很多个月前从另一个答案中解决的:
# makes the current shell have an environment like cron or upstart # https://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中获取所有内容).好极了!