【发布时间】:2016-03-05 08:46:00
【问题描述】:
当我试图杀死一个 python 进程时,通过os.system 启动的子进程不会同时终止。
Killing child process when parent crashes in python 和 Python Process won't call atexit (atexit 看起来不适用于信号)
这是否意味着我需要自己处理这种情况?如果是这样,首选的方法是什么?
> python main.py
> ps
4792 ttys002 0:00.03 python run.py
4793 ttys002 0:00.03 python loop.py
> kill -15 4792
> ps
4793 ttys002 0:00.03 python loop.py
示例代码:
main.py
import os
os.system('python loop.py')
循环.py
import time
while True:
time.sleep(1000)
更新1
我做了一些实验,找到了一个可行的版本,但仍然对逻辑感到困惑。
import os
import sys
import signal
import subprocess
def sigterm_handler(_signo, _stack_frame):
# it raises SystemExit(0):
print 'go die'
sys.exit(0)
signal.signal(signal.SIGTERM, sigterm_handler)
try:
# os.system('python loop.py')
# use os.system won't work, it will even ignore the SIGTERM entirely for some reason
subprocess.call(['python', 'loop.py'])
except:
os.killpg(0, signal.SIGKILL)
【问题讨论】:
-
这里的问题可能是因为你用
SIGKILL信号(-9)杀死了它。这意味着它将在不调用任何其他信号处理程序的情况下终止进程,因为无法捕获SIGKILL。您应该改用SIGTERM,并在所有其他方法都失败时使用SIGKILL。 -
@LoïcFaure-Lacroix 抱歉,这实际上是一个错字。我用 SIGTERM 终止进程。
-
您可能想在此处阅读有关信号的内容:pymotw.com/2/subprocess
-
@lucemia:我的回答不准确。虽然它不会更改代码示例。见the update
-
@J.F.Sebastian 谢谢,你的回答真的很有用!
标签: python subprocess