我们有一个自定义的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?
答案 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约定处理它们。