Quando um processo Python é eliminado no OS X, por que ele não mata os processos filhos?

7

Eu me peguei ficando muito confuso por algumas mudanças que encontrei ao mover scripts do Python do Linux para o OS X ...

No Linux, se um script Python tiver chamado os.system () e o processo de chamada for eliminado, o processo chamado será eliminado ao mesmo tempo.

No OS X, no entanto, se o processo principal for eliminado, tudo o que foi lançado é deixado para trás.

Existe algo em algum lugar no OS X / Python onde eu possa mudar esse comportamento?

Isso está causando problemas em nosso farm de renderização, onde os processos podem ser eliminados da GUI de gerenciamento, mas o processo de nível superior é realmente apenas um wrapper, portanto, embora o gerenciamento do farm de renderização possa pensar que o processo máquina é liberada para outra tarefa, a tarefa com uso intenso do processador ainda está em execução, o que pode levar a enormes bloqueios.

Eu sei que eu poderia escrever mais lógica para capturar o sinal kill e passá-lo para os processos filhos, mas eu esperava que fosse algo que poderia ser habilitado em um nível inferior.

    
por Hugh 24.01.2010 / 02:54

1 resposta

4

No Linux, quando você mata um pai, o filho recebe um SIGHUP , que geralmente o mata, a menos que tenha sido feito para permanecer vivo como um daemon, caso em que ele irá prender o sighup. (Eu acho que é por isso que um geralmente usa SIGHUP para dizer a um daemon para se atualizar, já que é convenientemente sempre preso).

No Mac OS X não consigo encontrar documentação, mas parece que nenhum SIGHUP foi enviado. Como resultado, o processo filho é órfão e seu novo pai é o avô.

A maneira como você lida com isso é enviar o sinal kill para o grupo de processos do pai, não o processo pai em si. Isso vai neutralizar todos os filhos e netos, bem como uma ressalva. Se qualquer processo filho fizer um setpgrp () ou setsid (), ele escapa da associação do grupo de processos. Ele não obterá o kill enviado para seu antigo grupo de processos. Normalmente, não é necessário se preocupar com este último, pois geralmente é intencional quando usado para atingir esse objetivo.

    
por 20.05.2010 / 07:54