web-dev-qa-db-ja.com

PythonプロセスがOSXで強制終了された場合、なぜ子プロセスを強制終了しないのですか?

PythonスクリプトをLinuxからOSXに移行するときに見つけたいくつかの変更により、しばらく前に非常に混乱しました。

Linuxでは、Pythonスクリプトがos.system()を呼び出し、呼び出しプロセスが強制終了された場合、呼び出されたプロセスも同時に強制終了されます。

ただし、OS Xでは、メインプロセスが強制終了されると、起動したものはすべて取り残されます。

OS X/Pythonのどこかに、この動作を変更できるものはありますか?

これにより、レンダーファームで問題が発生し、管理GUIからプロセスを強制終了できますが、最上位のプロセスは実際には単なるラッパーであるため、レンダーファームの管理者は、プロセスが終了してマシンが解放されたと見なす可能性があります。別のタスクのために、実際のプロセッサを集中的に使用するタスクがまだ実行されているため、大きな障害が発生する可能性があります。

キルシグナルをキャッチして子プロセスに渡すためのロジックをもっと書くことができることは知っていますが、それがより低いレベルで有効にできるものになることを望んでいました。

8
Hugh

Linuxでは、親を殺すと、子に [〜#〜] sighup [〜#〜] が送信されます。これは、デーモンとして存続することを意図していない限り、通常は子を殺します。ため息をつくでしょう。 (これが、通常SIGHUPを使用してデーモンに自分自身を更新するように指示する理由だと思います。

Mac OS Xでドキュメントが見つかりませんが、SIGHUPが送信されないようです。その結果、子プロセスは孤立し、その新しい親は祖父母になります。

これに対処する方法は、親プロセス自体ではなく、親のプロセスグループにkillシグナルを送信することです。これにより、すべての子供と孫も同様に1つの警告で核兵器になります。子プロセスがsetpgrp()またはsetsid()を実行すると、プロセスグループのメンバーシップをエスケープします。古いプロセスグループにkillが送信されることはありません。後者は通常、その目的を達成するために使用されるときに意図的なものであるため、通常、後者について心配する必要はありません。

5
Cstrauss