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 でプロセスを起動するためだと思います。

私もこれを試しましたが、うまくいかないのは、環境変数を設定するとプロセスが実行されるためだと思いますか? 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 を適切に設定し、一度フォークしたアプリの正しい pid を Upstart に追跡させる方法はありますか?

4

3 に答える 3

17

ぎこちないです。推奨される方法は、env ファイルを pre-start スタンザに書き込んでから、スクリプト スタンザで source することです。ばかげている、私は知っている。

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 行を使用します。

これは、'. ' コマンドは組み込みのダッシュであるため、プロセスは生成されません。

于 2012-09-29T03:23:28.053 に答える
2

zram-config の upstart config によると:

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 以外のシェルにシンボリック リンクされた /bin/sh がスクリプトを実行する可能性があることを覚えているので、Bash のみの構成は避けます。

Re: 「env」スタンザを使用すると、値は文字どおりに渡され、シェル規則を使用して処理されません。

于 2013-02-19T18:45:29.423 に答える