10

我们有一个自定义的 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 值,我假设是因为那些 cat、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`

也尝试在启动前执行此操作,但设置的环境变量在 exec 节中没有任何值:

pre-start
    NUM_CORES=32
end script

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

4

3 回答 3

17

这很尴尬。推荐的方法是在 pre-start 节中编写一个 env 文件,然后在 script 节中获取它。这很荒谬,我知道。

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

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

这仅适用于 '. ' 命令是内置的破折号,因此不会产生任何进程。

于 2012-09-29T03:23:28.053 回答
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
于 2013-05-30T08:53:26.953 回答
0

我会补充

export NUM_CORES

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

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

于 2013-02-19T18:45:29.423 回答