Python: system()やpopen()系で実行したプロセスは自分の孫プロセスになる?

2010年2月14日

表題で書いた問題をみなさん意識されたことはありますでしょうか?
通常system(cmd), popen(cmd)などを実行する際、コマンド文字列cmdを引数として渡して 実行していると思います。その場合、/bin/shシェルを経由して実行されるので

実行プロセス -> /bin/sh -> cmdプロセス


という関係になります。
この場合、実行プロセスからcmdプロセスのpidを取得することは出来ません。 なので、cmdプロセスをコントロール(終了させたり)するのが難しくなります。

実行プロセスに直接cmdプロセスをつなぎたい場合は、cmd文字列ではなく コマンドラインをリストとして渡しましょう。多くの場合cmd.split(' ')として リスト化しsystemやpopenに渡してあげればOKです。 ですが、スペース文字でパースするとおかしくなる場合も当然ありますので、そこは ケースバイケースで正しくリスト化するようにしてください。 こうすることで、プロセスの親子関係は以下のようになります。

実行プロセス -> cmdプロセス