2

スクリプトに問題があります。目的は、1 つまたは複数の OpenVZ コンテナーを起動して、何らかのテストを実行することです。これらのテストは非常に長くなる可能性があります (通常は約 3 時間)。

最初のスクリプトは次のようになり、起動するキュー メンバーを並べ替えた後、次のようになります。

subprocess.Popen(QUEUE_EXECUTER % queue['queue_id'], shell=True)

ここで、「QUEUE_EXECUTER % queue['queue_id']」は実行する完全なコマンドです。queue_executer スクリプトでは、次のようになります。

# Launching install
cmd = queue['cmd_install']
report_install = open(queue['report_install'], 'a')
process_install = subprocess.Popen(cmd, shell=True, stdout=report_install, stderr=subprocess.STDOUT)
process_install.wait()

# Launching test
logger.debug('Launching test')
report_test = open(queue['report_test'], 'a')
cmd = queue['cmd_test']
process_test = subprocess.Popen(cmd, shell=True, stdout=report_test, stderr=subprocess.STDOUT)
process_test.wait()

それは非常にうまく機能しますが、しばらくの間、そして最近ではほとんどの場合、実行が停止します。ログなどにエラーはありません。レポートファイルは、行の書き込みの途中で停止したことを示しています(これは、Python側でファイルが正しく閉じられていないためだと思います)。ホスト側では、OOM キラーは何もしていないようで、ホストのログを検索しても何も見つかりませんでした。

上で起動した 2 つの「cmd」は、基本的に vz をセットアップし、その上でテスト プログラムを実行するシェル スクリプトです。

だから私の大きな質問は、Python側でスクリプトが停止する原因となる何かが欠けているのでしょうか?

ありがとう。

編集:いくつかの補足情報。

失敗するコマンドは常に 2 番目のコマンドです。/path/vzspawncluster.sh /tmp/file web --tarball /services/pkgs/etch/releases/archive.tar.gz --create実行しようとするコマンドの 2 つの値の例を次に示します。/path/vzlaunch.sh 172 -b trunk --args "-a -v -s --time --cluster --sql=qa3 --queue=223 --html --mail=adress@mail.com"

vzlaunch スクリプトvzctl enter ID /path/script.pyは、ID がコンテナー ID で、/path/script.py がコンテナーのスクリプトである OpenVZ コンテナーで Python スクリプトを起動します。

マシン report_install および report_test は、NFS 共有を介してアクセスされる別のマシンにあるファイルです。それは問題ではありませんが、失敗したときに何が起こっているのか本当にわからないので、とにかくメモします。

失敗すると、コンテナのプロセスは死にます。ゾンビ状態などではなく、ただ死んでいるだけです。コンテナーのプロセスは失敗しますが、メイン プロセス (それらすべてを起動するプロセス) は、すべてが正常であるかのように続行します。

いくつかの詳細情報: smci によって指摘されたバッファ フラッシュ アプローチを試しましたが、ログ ファイルの書き込みが行の途中で中断され続けます。

[18:55:27][Scripteo]       Create process '/QA/valideo.trunk/tests/756/test.py -i 10.1.11.122 --report --verbose --name 756 --...
[18:56:35][Scripteo]       Create process '/QA/valideo.trunk/tests/762/test.py -i 10.1.11.122 --report --verbose --name 762 --...
[18:57:56][Scripteo]       Create process '/QA/valideo.trunk/tests/764/test.py -i 10.1.11.122 --report --verbose --name 764 --...
[18:59:27][Scripteo]       Create process '/QA/valideo.trunk/tests/789/test.py -i 10.1.11.122 --report --verbose --name 789 --...
[19:00:44][Scripteo]       Create process '/QA/valideo.trunk/tests/866/test.py -i 10.1.11.122 --report --verbose --name 866 --...
[19:02:27][Scripteo]       Create process '/QA/valideo.trunk/tests/867/test.py -i 10.1.11.122 --report --verbose --name 867 --...
[19:04:13][Scripteo]       Create process '/QA/valideo.trunk/tests/874/t
4

1 に答える 1

0

あなたの意図は、最初にprocess_install終了するまで実行し、次にprocess_wait?を実行することです。(順次、マルチプロセッシングではありませんよね?) タイムアウトすると思われるコマンドはどれですか?

の実際の値を貼り付けてくださいqueue['cmd_install'], queue['cmd_test']

(これらのコマンドのいずれかの末尾に「&」またはリダイレクトがありますか?)

ここに私のデバッグの提案があります:

  • (OpenVZ についてはわかりませんが、ログと、終了時コマンドの実行が許可されているかどうかを確認したと思います)

  • UNIX 上で実行していますか? その場合は、コマンドをいじって cmd をバックグラウンドで実行し、ループを実行して出力を生成することもできます。または、できcmd; touch donesentinelます。

  • wait() の代わりに、間隔ごとに各 Popen オブジェクトの poll() にポーリング ループを追加してみてください。

  • または、起動後に Popen.pid を出力し、プロセスがまだ生きていることを外部からチェックまたはポーリングします (例: UNIX の場合top -p)。

  • プロセスが大量の出力を生成する場合、Popen.wait() に関する警告に注意しましたか? Warning: This will deadlock when using stdout=PIPE and/or stderr=PIPE and the child process generates enough output to a pipe such that it blocks waiting for the OS pipe buffer to accept more data. Use communicate() to avoid that.

  • それが起こっていると思われる場合は、stdout、stderr のいずれかまたは両方を os.devnullにリダイレクトし、結果が異なるかどうかを確認してください。または、このバッファ フラッシュ アプローチを参照してください。

于 2011-07-15T04:46:32.133 に答える