【发布时间】:2011-09-26 20:08:40
【问题描述】:
例如来自 bash:
杀死 -9 -PIDos.kill(pid, signal.SIGKILL) 只杀死父进程。
【问题讨论】:
-
您实际运行了哪些代码来解决您的问题?
-
您是否也想杀死父进程...我假设只是子进程对吗?
标签: python
例如来自 bash:
杀死 -9 -PIDos.kill(pid, signal.SIGKILL) 只杀死父进程。
【问题讨论】:
标签: python
如果父进程不是“进程组”但你想和子进程一起杀掉它,你可以使用 psutil (https://psutil.readthedocs.io/en/latest/#processes)。 os.killpg 无法识别非进程组的 pid。
import psutil
parent_pid = 30437 # my example
parent = psutil.Process(parent_pid)
for child in parent.children(recursive=True): # or parent.children() for recursive=False
child.kill()
parent.kill()
【讨论】:
killpg 会杀死我当前进程所在的进程组,这将终止整个程序。
当您将 negative PID 传递给kill 时,它实际上通过该(绝对)数字将信号发送到进程 group。您可以在 Python 中使用 os.killpg() 进行等效操作。
【讨论】:
kill -9 -17351 杀死一个组进程而不是kill -9 17351 仅杀死父进程。 stackoverflow.com/questions/392022/…
如果您的进程不是进程组并且您不想使用 psutil,另一种解决方案是运行以下 shell 命令:
pkill -TERM -P 12345
例如
os.system('pkill -TERM -P {pid}'.format(pid=12345))
【讨论】:
没有一个答案可以帮助我,所以我做了一些研究并写下了我的答案:
您可以使用os 模块轻松完成此操作,但它对平台敏感。这意味着有些命令仅在 Unix 上可用,有些则在任何平台上可用。
所以我的项目在不同的地方和时间启动了一个进程,以及几个子进程。一些子进程启动了子进程:)
所以我找到了这个解决方案:
import os
import signal
import platform
# get the current PID for safe terminate server if needed:
PID = os.getpid()
if platform.system() is not 'Windows':
PGID = os.getpgid(PID)
if platform.system() is not 'Windows':
os.killpg(PGID, signal.SIGKILL)
else:
os.kill(PID, signal.SIGTERM)
我在 Linux 上使用 SIGKILL 来立即终止进程,在 Windows 上使用 SIGTERM,因为上面没有 SIGKILL。
我还使用killpg() 杀死了Linux 上的整个进程组。
附:在 Linux 上检查,但在 Windows 上仍然不检查,所以也许我们需要针对 Windows 的其他命令(例如 CTRL_C_EVENT 或 use another answer。)
【讨论】:
您应该使用信号参数 9 来终止进程树。
root@localhost:~$ python
>>> import os
>>> os.kill(pid, 9)
如果你应该使用signal.SIGKILL constant,你应该使用os.killpg(pgid, signal.SIGKILL)来杀死进程树。
【讨论】:
os.kill(pid, 9) 在signal.SIGKILL 恰好是9 时起作用,这在大多数平台上都存在。尽管如此,signal.SIGKILL 是正确使用的常量,使用 9 代替 signal.SIGKILL 并不是一种改进,也不能以任何方式解决 OP 的问题。
我不知道这是否是您要求的,但如果您希望终止应用程序的其他进程并且它们都是使用多处理包创建的,您可以执行以下操作:
import multiprocessing
from time import sleep
...
def on_shutdown():
for child in multiprocessing.active_children():
print('Terminating', child)
child.terminate()
sleep(0.5)
【讨论】: