Hug*_*ugh 8 linux kill python process macos
不久前,我发现自己在将 Python 脚本从 Linux 迁移到 OS X 时发现的一些更改感到非常困惑......
在 Linux 上,如果 Python 脚本调用了 os.system(),并且调用进程被杀死,则被调用进程将同时被杀死。
然而,在 OS X 上,如果主进程被杀死,它启动的任何东西都会被留下。
在 OS X/Python 中有什么地方可以改变这种行为吗?
这会导致我们的渲染农场出现问题,其中进程可以从管理 GUI 中终止,但顶级进程实际上只是一个包装器,因此,渲染农场管理可能认为该进程已经消失并且机器被释放准备另一个任务时,实际的处理器密集型任务仍在运行,这可能会导致巨大的阻塞。
我知道我可以编写更多的逻辑来捕获终止信号并将其传递给子进程,但我希望它可以在较低级别启用。
小智 6
在 Linux 上,当您杀死父进程时,子进程会收到一个SIGHUP,通常会杀死它,除非它打算作为守护进程保持活动状态,在这种情况下它会捕获 sighup。(我认为这就是为什么人们通常使用 SIGHUP 来告诉守护进程自我刷新,因为它总是很方便地被困)。
在 Mac OS XI 上找不到文档,但似乎没有发送 SIGHUP。结果,子进程是孤立的,它的新父进程是祖父进程。
处理这个问题的方法是将终止信号发送到父进程组,而不是父进程本身。这将用一个警告来消灭所有的孩子和孙子孙女。如果任何子进程执行 setpgrp() 或 setsid() ,则它会转义进程组成员身份。它不会将杀死发送到其旧进程组。通常人们不必担心后者,因为在用于实现该目的时通常是有意的。
归档时间: |
|
查看次数: |
4665 次 |
最近记录: |