使用Upstart(Ubuntu)启动时,应用程序无法获取环境变量

前端之家收集整理的这篇文章主要介绍了使用Upstart(Ubuntu)启动时,应用程序无法获取环境变量前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何在不重新启动服务器的情况下获取系统范围内的新环境变量?

作为一个Ubuntu 11.x服务器,我正在使用Upstart来启动/重启进程.

我在/ etc / environment中添加了一个新的环境变量,需要通过我的某个应用程序进程获取.

如果我直接从我的shell启动进程,那么变量就被拾取并且一切正常(我已经为我的会话提供了/ etc / environment).但是,当我使用其Upstart服务名称启动/重新启动进程时,不会看到该变量.

sudo start app-name

我很确定,如果我重新启动服务器,新变量将被拾取,但我想尽量避免这种情况.我在其上运行了一些其他的实时进程,我希望尽可能避免中断.

这个问题似乎包含了很多关于如何在Upstart脚本中处理环境变量的子问题,所以我想我会分享一些事情来处理和测试Upstart和Cron的环境.

关于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中获取所有内容).好极了!

原文链接:https://www.f2er.com/ubuntu/348569.html

猜你在找的Ubuntu相关文章