如何在Upstart脚本中预启动设置环境变量?

Zac*_*ach 10 upstart environment-variables

我们有一个自定义的C++守护程序应用程序,它只能分叉一次.所以我们一直在Ubuntu 12.04上的Upstart脚本中这样做,它完美地工作:

expect fork
exec /path/to/the/app
Run Code Online (Sandbox Code Playgroud)

但是现在我们需要向我们的app传递一个参数,该参数包含运行它的机器上的CPU数量:

cat /proc/cpuinfo | grep processor | wc -l
Run Code Online (Sandbox Code Playgroud)

我们的第一次尝试就是:

expect fork
exec /path/to/the/app -t `cat /proc/cpuinfo | grep processor | wc -l`
Run Code Online (Sandbox Code Playgroud)

而我们开始用正确的-t值的应用程序,新贵跟踪错误的PID值,我假设,因为这些猫,grep的&WC命令在EXEC所有启动过程中我们的应用程序之前.

我也试过这个,即使它不起作用,我想因为设置一个env var运行一个进程?Upstart仍然跟踪错误的pid:

expect fork
script
    NUM_CORES=32
    /path/to/the/app -t $NUM_CORES
end script
Run Code Online (Sandbox Code Playgroud)

我也试过在env节中这样做,但显然那些不运行命令:

env num_cores=`cat /proc/cpuinfo | grep processor | wc -l`
Run Code Online (Sandbox Code Playgroud)

也尝试在pre-start中执行此操作,但设置的env vars在exec节中没有任何值:

pre-start
    NUM_CORES=32
end script
Run Code Online (Sandbox Code Playgroud)

知道如何正确设置这个NUM_CORES,并仍然让Upstart跟踪我们的应用程序一次分叉的正确pid吗?

mpm*_*mpm 17

这很尴尬.建议的方法是在pre-start节中编写一个env文件,然后在脚本节中获取它.我知道,这太荒谬了.

expect fork

pre-start script
    exec >"/tmp/$UPSTART_JOB"
    echo "NUM_CORES=$(cat /proc/cpuinfo | grep processor | wc -l)"
end script

script
    . "/tmp/$UPSTART_JOB"
    /path/to/app -t "$NUM_CORES"
end script

post-start script
    rm -f "/tmp/$UPSTART_JOB"
end script
Run Code Online (Sandbox Code Playgroud)

我在预启动时使用exec行,因为我通常有多个env变量,我不想重复重定向代码.

这只适用于'.'命令是一个内置的短划线,因此没有生成任何进程.