Python スクリプト内からインストール プログラムの実行が終了したことを検出しようとしています。具体的には、アプリケーションは Oracle 10gR2 データベースです。現在、Popen で subprocess モジュールを使用しています。理想的には、単に wait() メソッドを使用してインストールの実行が完了するのを待つだけですが、ドキュメントに記載されているコマンドは実際には子プロセスを生成して実際のインストールを処理します。失敗したコードのサンプル コードを次に示します。
import subprocess
OUI_DATABASE_10GR2_SUBPROCESS = ['sudo',
'-u',
'oracle',
os.path.join(DATABASE_10GR2_TMP_PATH,
'database',
'runInstaller'),
'-ignoreSysPrereqs',
'-silent',
'-noconfig',
'-responseFile '+ORACLE_DATABASE_10GR2_SILENT_RESPONSE]
oracle_subprocess = subprocess.Popen(OUI_DATABASE_10GR2_SUBPROCESS)
oracle_subprocess.wait()
ここに同様の質問があります: Killing a subprocess including its children from pythonですが、選択された回答は子の問題に対処していません。代わりに、待機するアプリケーションを直接呼び出すようにユーザーに指示します。サブプロセスのすべての子を待機する特定のソリューションを探しています。サブプロセスの数が不明な場合はどうなりますか? すべての子サブプロセスが完了するのを待つという問題に対処する回答を選択します。
失敗の明確化: 子プロセスは、wait() コマンドの後も実行を継続します。これは、そのコマンドが最上位プロセス (この場合は「sudo」) のみを待機するためです。この問題で知られている子プロセスの簡単な図を次に示します: Python subprocess module -> Sudo -> runInstaller -> java -> (unknown)