В python 2.7 на Ubuntu 14.04 я запускаю такой процесс:
bag_process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
for i in range(5):
print "Countdown: {}".format(5 - i - 1)
time.sleep(1)
print "Sending SIGINT to PID {}".format(bag_process.pid)
bag_process.send_signal(signal.SIGINT)
(bag_out, bag_err) = bag_process.communicate()
Программа зависает на строке communicate()
.Когда я открываю другой терминал, я запускаю ps -ef | grep ###
, чтобы найти pid подпроцесса, и я вижу, что он <defunct>
.
Почему дочерняя программа перестает работать, а родительская программа висит на communicate()
?При условии, что ребенок действительно завершает работу после получения SIGINT
, как я могу заставить родительскую программу надежно справиться с этим без зависания?