8 votes

Quand un processus Python est tué sous OS X, pourquoi ne tue-t-il pas les processus enfants ?

Il y a quelque temps, je me suis retrouvé très confus par certains changements que j'ai trouvés en déplaçant les scripts Python de Linux vers OS X...

Sous Linux, si un script Python a appelé os.system(), et que le processus appelant est tué, le processus appelé sera tué en même temps.

Sous OS X, cependant, si le processus principal est tué, tout ce qu'il a lancé est laissé derrière.

Existe-t-il quelque chose dans OS X/Python qui me permette de modifier ce comportement ?

Cela pose des problèmes dans notre ferme de rendu, où les processus peuvent être tués à partir de l'interface graphique de gestion, mais le processus de niveau supérieur n'est en fait qu'une enveloppe. Ainsi, alors que la gestion de la ferme de rendu peut penser que le processus a disparu et que la machine est libérée pour une autre tâche, la tâche réelle à forte intensité de processeur est toujours en cours, ce qui peut entraîner d'énormes blocages.

Je sais que je pourrais écrire plus de logique pour attraper le signal d'arrêt et le transmettre aux processus enfants, mais j'espérais que cela pourrait être quelque chose qui pourrait être activé à un niveau inférieur.

6voto

Cstrauss Points 84

Sous Linux, lorsque vous tuez un parent, l'enfant reçoit un message SIGHUP ce qui le tuera généralement, à moins qu'il ne soit destiné à rester en vie en tant que démon, auquel cas il sera piégé par sighup. (Je pense que c'est la raison pour laquelle on utilise habituellement SIGHUP pour dire à un démon de se rafraîchir, puisqu'il est toujours piégé).

Sous Mac OS X, je ne trouve pas de documentation, mais il semble qu'aucun SIGHUP ne soit envoyé. Par conséquent, le processus enfant est orphelin, et son nouveau parent est le grand-parent.

La façon de traiter ce problème est d'envoyer le signal kill au groupe de processus du parent, et non au processus parent lui-même. Cela détruira tous les enfants et petits-enfants à une condition près. Si un processus enfant fait un setpgrp() ou setsid(), il échappe à l'appartenance au groupe de processus. Il ne recevra pas le kill envoyé à son ancien groupe de processus. En général, il n'y a pas lieu de s'inquiéter de ce dernier point car il est généralement intentionnel lorsqu'il est utilisé dans ce but.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X