Я пытаюсь определить, когда программа установки завершает выполнение из сценария Python. В частности, приложение - это база данных Oracle 10gR2. В настоящее время я использую модуль подпроцесса с Popen. В идеале я бы просто использовал метод 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()
Здесь есть аналогичный вопрос: Убивает подпроцесс, включая его дочерние элементы из python , но выбранный ответ не решает проблему дочерних элементов, вместо этого он инструктирует Пользователь должен напрямую вызвать приложение, которого нужно ждать. Я ищу конкретное решение, которое будет ждать всех дочерних процессов подпроцесса. Что делать, если количество подпроцессов неизвестно? Я выберу ответ, который решает проблему ожидания завершения всех дочерних подпроцессов.
Больше ясности относительно сбоя: Дочерние процессы продолжают выполнение после команды wait (), поскольку эта команда ожидает только процесса верхнего уровня (в данном случае это «sudo»). Вот простая диаграмма известных дочерних процессов в этой задаче: Модуль подпроцесса Python -> Sudo -> runInstaller -> java -> (unknown)