ao-log

インフラ系ITエンジニアのメモ帳です。

python 2.6 の subprocess で wait() を使うと子プロセスが defunct してしまう

python 内部から、OS のコマンドを実行したい場合は、os.system や subprocess モジュールを用います。subprocess モジュールを用いて、コマンド実行終了を Popen.wait() で待つような実装をしていたのですが、いざ動かしてみると問題が。

OS のコマンドから、大量の子プロセスが生成されるような処理をしており、生成する子プロセスが少ないとうまくいくのですが、500 個くらいの子プロセスを実行したあたりで、子プロセスが defunct してしまい、そこで処理が固まってしまってます。

どう対応すべきか、すぐ分からなかったのですが、ドキュメントを見ると、次の記述が。

子プロセスが stdout もしくは stderr パイプに対してブロックするまで出力し、 OSのパイプバッファが送信可能になるまで待つ場合、このメソッドを呼ぶとデッドロックします。これを避けるために、 communicate() を利用してください。
http://docs.python.jp/2.6/library/subprocess.html より

Popen.wait() → Popen.communicate() に書き換えることで解決しました。