启动Upstart(Ubuntu)时,应用程序无法启动环境variables

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

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

我在/ etc / environment中添加了一个新的环境variables,这个variables需要被我的一个应用程序的进程提取出来。

如果我直接从我的shell启动进程,variables正在拾取,一切正常(我已经为我的会话源/ etc /环境)。 但是,当我使用其Upstart服务名称启动/重新启动进程时,variables没有被看到。

sudo start app-name 

我很确定,如果我重新启动服务器的新variables将被拿起,但我想尽量避免这一点。 我还有其他一些正在运行的进程,我想尽可能避免中断。

    这个问题似乎包含了很多关于如何处理Upstart脚本中的环境variables的子问题,所以我想我会分享一些我为Upstart和Cron处理和testing环境的事情。

    首先要了解的是Upstart等等,它不像活跃的terminal那样共享相同的环境,所以像这样:

     $ export FOO=bar $ start upstart-name 

    不起作用,因为Upstart upstart-name实际上不会看到刚刚导出到当前shell的FOO ,因为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 

    现在,让我们在我们的框中设置一个共享环境,我们将把环境variables放在/etc/profile.d/environ.sh

     # /etc/profile.d/environ.sh export FOO=bar 

    然后在我们的Upstart脚本中find它:

     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所有内容)。 好极了!

    把env节纳入你的新贵职位描述文件。

    http://upstart.ubuntu.com/wiki/Stanzas#env

     env PIDFILE=/var/run/myprocess.pid 

    pipe他呢。 这些都在文档中。

    我有同样的问题。 我的启动脚本从命令行工作正常,但不是从暴发户脚本。

    我只需要find我的. /home/username/.bashrc . /home/username/.bashrc在我的暴发户脚本得到它与所有正确的环境variables的工作。

     script cd /home/me . /home/me/.bashrc ~/www/app/bin/server.production end script