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

时间:2012-09-26 21:01:41

标签: environment-variables upstart

我们有一个自定义的C ++守护程序应用程序,只需要一次。所以我们一直在Ubuntu 12.04上的Upstart脚本中这样做,它运行得很好:

expect fork
exec /path/to/the/app

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

cat /proc/cpuinfo | grep processor | wc -l

我们的第一次尝试就是:

expect fork
exec /path/to/the/app -t `cat /proc/cpuinfo | grep processor | wc -l`

虽然用正确的-t值启动我们的应用程序,但Upstart跟踪错误的pid值,我假设因为那些猫,grep& wc在我们的应用程序之前命令exec中的所有启动进程。

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

expect fork
script
    NUM_CORES=32
    /path/to/the/app -t $NUM_CORES
end script

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

env num_cores=`cat /proc/cpuinfo | grep processor | wc -l`

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

pre-start
    NUM_CORES=32
end script

有任何想法如何正确设置这个NUM_CORES,并且仍然让Upstart跟踪我们分离一次的应用的正确pid?

3 个答案:

答案 0 :(得分: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

我在pre-start中使用了exec行,因为我通常有多个env变量,我不想重复重定向代码。

这只适用于'。 '命令是一个内置的短划线,因此不会产生任何进程。

答案 1 :(得分:2)

根据zram-config的upstart配置:

script
    NUM_CORES=$(grep -c ^processor /proc/cpuinfo | sed 's/^0$/1/')
    /path/to/the/app -t $NUM_CORES
end script

答案 2 :(得分:0)

我会添加

export NUM_CORES

在“脚本”中为其指定值后。我记得一个/ bin / sh符号链接到一个非Bash shell可能会运行脚本,所以我会避免使用Bash构造。

Re:使用“env”节,它按字面意思传递值,不使用shell约定处理它们。