подпроцесс перестает функционировать, `connect ()` зависает - PullRequest
0 голосов
/ 01 июня 2018

В 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, как я могу заставить родительскую программу надежно справиться с этим без зависания?

1 Ответ

0 голосов
/ 05 июня 2018

Проблема заключалась в следующем: не завершайте процесс, подобный следующему:

bag_process.send_signal(signal.SIGINT)

Вместо этого уничтожайте процесс и все его подпроцессы следующим образом:

parent = psutil.Process(bag_process.pid)
for child in parent.get_children(recursive=True):
    child.send_signal(signal.SIGINT)
bag_process.send_signal(signal.SIGINT)
...