我有一组 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