Python Process зависает, пока дочерний процесс не завершится с использованием схемы - PullRequest
1 голос
/ 21 апреля 2011

У меня есть следующая проблема, связанная с синхронизацией процессов.

Существует сценарий python startup.py, исполняемый файл maestro и исполняемый файл tee. Мой скрипт на python startup.py запускает программу maestro и передает stderr / stdout maestro в файл журнала, используя команду tee, а также записывает в консоль.

Я добился этого, используя следующий код:

cmd = "maestro"
mae_err_log = "output.txt"
maestro = subprocess.Popen(cmd, stderr = subprocess.STDOUT, stdout=subprocess.PIPE)
tee = subprocess.Popen(['tee', mae_err_log], stdin = maestro.stdout)
maestro.stdout.close()
tee.communicate()
maestro_status = maestro.returncode
sys.exit(maestro_status)

Моя программа maestro - это программа с графическим интерфейсом, когда я выхожу из программы maestro, она внутренне вызывает posix system ("maestro_cleanup &") api и немедленно завершает работу. Я заметил, что моя программа maestro не выпускает консоль до тех пор, пока программа maestro_cleanup не прекратит работу, хотя я запускаю maestro_cleanup в фоновом режиме. Мне нужно запустить maestro_cleanup в фоновом режиме, так как это занимает время, и я не хочу держать консоль в течение периода, пока не завершится maestro_cleanup. Используя приведенный выше код, программа maestro не завершает свою работу, пока не завершится maestro_cleanup.

Я вижу, что "ps -elf" показывает следующее:

0 S j 16876  6678  0  75 0 - 65307 wait 18:56 pts/53 00:00:00 python startup.py
0 Z j 17230 16876  4  76 0 - 0     exit 18:56 pts/53 00:00:04 [maestro] <defunct>
0 S j 17231 16876  0  77 0 - 948 pipe_w 18:56 pts/53 00:00:00 /usr/bin/tee output.txt
0 S j 17424     1  0  77   0 -   948 -  18:57 pts/53   00:00:00 maestro_cleanup

Вы можете видеть, что родительский процесс maestro_cleanup является идентификатором процесса сеанса вместо maestro, потому что я запустил maestro_cleanup с использованием системного API в фоновом режиме.

Есть идеи, почему маэстро не завершает работу до тех пор, пока не завершится maestro_cleanup?

Буду признателен за любую помощь.

-Vipin

Ответы [ 2 ]

1 голос
/ 05 июля 2011

Что ж, подпроцесс . Открытая документация действительно говорит, что tee.communicate () будет "Ожидание завершения процесса";также ваш вызов такой же, как у этого парня , который говорит, что его дочерний процесс выполняется в фоновом режиме, так что это выглядит нормально.Так что эта блокировка перед выходом звучит как ограничение подпроцесса.

Попробуйте ссылки в 'Python порождает дочерний подпроцесс, отсоединяется и завершается' , который ссылается на рецепт ActiveState: 'Создание демона способом Python ': способ Python для отсоединения процесса от управляющего терминала и запуска его в фоновом режиме в качестве демона.

0 голосов
/ 01 декабря 2013

Я бы сказал, используйте close_fd=True.Это должно сработать.

...