Python进程挂起,直到子进程使用tee方案终止

时间:2011-04-21 14:05:42

标签: python popen tee

我遇到与进程同步有关的以下问题。

有一个python脚本startup.py,一个可执行的maestro和一个可执行的tee。 我的python脚本startup.py启动maestro程序,并使用tee将maestro的stderr / stdout传输到日志文件中,并写入控制台。

我使用以下代码实现了这个目标:

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程序是一个gui程序,它在内部调用posix系统(“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父进程是会话进程id而不是maestro,因为我在后台使用系统api启动了maestro_cleanup。

知道为什么maestro在maestro_cleanup结束之前不会终止?

任何帮助都将不胜感激。

-Vipin

2 个答案:

答案 0 :(得分:1)

subprocess.Popen documentation确实说tee.communicate()将“等待进程终止”;您的调用也与this guy相同,他确实说他的子进程在后台运行,所以看起来没问题。因此,这种退出前阻塞听起来像是子流程的限制。

尝试引用ActiveState配方的'Python spawn off a child subprocess, detach, and exit'中的链接:'以Python方式创建守护进程':将进程从控制终端分离并在后台作为守护进程运行的Python方法。

答案 1 :(得分:0)

我说使用close_fd=True。应该这样做。