2016-04-28 3 views
1

Что я хочу? Создать сценарий, который запускает и убивает протокол связиУбить созданный подпроцесс и все созданные им процессы

Что я имею? У меня есть скрипт python, который открывает сценарий оболочки, и этот сценарий оболочки инициализирует протокол. Когда я убиваю родительский процесс, все идет хорошо (но в конечном проекте родительский процесс должен остаться в живых), но когда я убиваю подпроцесс, он становится функцией зомби, и мой протокол продолжает работать.

проблемы я считаю, может быть: я «убийство» сценарий оболочки (а не протокол, это то, что я хочу)

Линия Я запустить сценарий оболочки:

`protocolProcess = subprocess.Popen(["sh", arquivo], cwd = localDoArquivo) #inicia o protocolo` 

protocolProcessPID = protocolProcess.pid #armazena o pid do protocolProcess 

Линия Я убью скрипт оболочки: os.kill(protocolPID, signal.SIGTERM)

Ну, вот и все! Если кто-нибудь может мне помочь, я буду очень благодарен

+0

Связанный: [Как завершить подпроцесс python, запущенный с оболочкой = True] (http://stackoverflow.com/q/4789837/4279) – jfs

ответ

1

Процессы зомби - это процессы, которые еще не были получены родительским процессом.

Родительский процесс будет удерживать эти обработчики процессов до конца времени или пока не будет прочитан статус выхода процесса или сам будет убит.

Похоже, что родительский процесс должен иметь лучшую ручку в том, как он порождает и пожинает своих детей. Просто убить дочерний процесс недостаточно, чтобы освободить зомби-процесс.

+0

Есть ли правильный и рекомендуемый способ начать и закончить его? –

+0

@FernandoSantos: не беспокойтесь о зомби, если их много. См. [Что такое для процесса и почему его не убивают?] (Http://askubuntu.com/q/201303/3712) – jfs

+0

Чтобы убить ребенка, вы должны использовать функцию terminate(). И используйте опрос, пока процесс не умер. Как только процесс умер, и вы прочитали код возврата, он должен использовать процесс зомби. – sverasch