将环境变量导出到孙级作业

将环境变量导出到孙级作业

我有一组 upstart 脚本,由 foreman 从 Procfile 生成,用于启动我的 Web 服务和异步任务队列工作器。 foreman 生成脚本的方式如下:

  • 应用程序
  • 应用程序网络
  • 应用程序-web-1
  • 应用程序工作者
  • 应用程序-工作者-1

其中,“app-web”和“app-worker”设置为在启动“app”时启动,“app-web-1”和“app-worker-1”分别设置为在启动“app-web”和“app-worker”时启动。据我了解,这种结构是为了让您在负载增加时轻松添加更多 web 和 worker 进程,同时仍从顶级“app”作业管理整个过程。

因此,我想在我的作业中设置各种环境变量。我当然可以将它们直接放入底层脚本中,但最好将它们放在顶层,这样它们只需定义一次。我认为我可以通过简单地使用和在 app.conf 中做到这env一点export

env FOO=bar
export FOO

但这似乎不起作用:如果我把它放在中间的“app-web”作业中,那就没问题了,但如果我把它放在顶层的“app”中,它就不会被底层的“app-web-1”继承。所以,我的第二次尝试是把它放在顶层脚本中,然后尝试在中间的脚本中重新导出export FOO,但这也不起作用。

我是否可以做到我想做的事,或者我应该简单地满足于在多个地方定义变量?

答案1

您可以通过两种方式执行此操作:export中间脚本中的变量或将其保存在文件中并在最低脚本中提供它。

我在 lubuntu 12.04 上测试了这个例子:

myapp.conf是主脚本和导出MYAPP_FOO变量:

# myapp - 
description "export environment variable"
env MYAPP_FOO=bar
export MYAPP_FOO

task
console log
script
    exec  echo "$MYAPP_FOO - myapp" 
end script

应用程序的 web.conf是导出父级变量并定义和导出的中间脚本MYAPP_FOO1

# app-web - 
description "export environment variable"
start on starting myapp
env MYAPP_FOO1=bar1
export MYAPP_FOO1
export MYAPP_FOO

task
console log
script  
   exec  echo "$MYAPP_FOO - app-web - $MYAPP_FOO1" 
end script

最后应用程序-web1.conf打印变量:

# app-web1 - 
description "export environment variable"
start on starting app-web

task
console log
script  
   exec  echo "$MYAPP_FOO - app-web1 - $MYAPP_FOO1" 
end script

我使用了sudo start myapp,结果/var/log/upstart/app-web1.log是:

bar - app-web1 - bar1

另一种方法是在文件中定义变量并将其放在需要的位置:

# app-web1 - 
description "export environment variable"
start on starting app-web

task
console log
script  
   . /path/where/you/want/environmentFile
   exec  echo "$MYAPP_FOO - app-web1 - $MYAPP_FOO1" 
end script

或者您可以environmentFile在中间脚本中创建:

# app-web - 
description "export environment variable"
start on starting myapp
env MYAPP_FOO1=bar1

task
console log
script 
   env | grep MYAPP_ > /path/where/you/want/environmentFile 
   exec  echo "$MYAPP_FOO - app-web - $MYAPP_FOO1" 
end script

相关内容