如何在不重新启动服务器的情况下获取系统范围内的新环境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