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

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

如何在不重新启动服务器的情况下在系统范围内获取新的环境变量?

由于它是 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

相关内容