问:鉴于一个运行另一个python程序的python程序作为其子程序,如何使用python shell杀死进程[即通过获取进程pid然后执行kill -9 <pid>
]?
更详细信息:
我的脚本如下:
from subprocess import *
while True:
try:
Popen("python ...").wait() # some scrpipt
except:
exit(1)
try:
Popen("python ...").wait() # some scrpipt
except:
exit(1)
现在,当我想杀死这个过程及其子女时,我:
"ps -ef | grep python"
以获取pids。kill -9 <pid>
以终止进程。结果:在分配新的pid后,流程继续运行。
是否有一种优雅的方法可以让进程在被杀时正常退出?
答案 0 :(得分:3)
是否有一种优雅的方法可以让进程在被杀时正常退出?
kill -9
时没有。杀死SIGINT(-2
)或SIGTERM(-15
),并使用信号模块通过注册处理正常退出的清理函数来捕获它。
import sys
import signal
def cleanup_function(signal, frame):
# clean up all resources
sys.exit(0)
signal.signal(signal.SIGINT, cleanup_function)
答案 1 :(得分:0)
在此代码中,父级将等待子级的退出状态。如果父级正在获得其存在状态,则只有它将继续进行下一次迭代。
此外,您无法抓住SIGKILL
(SIGKILL
和SIGSTOP
是无法捕获的信号)
-9
表示SIGKILL
您可以实施任何其他信号的SIGNAL
处理程序
import os
import time
def my_job():
print 'I am {0}, son/daughter of {1}'.format(os.getpid(), os.getppid())
time.sleep(50)
pass
if __name__ == '__main__':
while True:
pid = os.fork()
if pid > 0:
expired_child = os.wait() # if child is getting killed, will return a tuple containing its pid and exit status indication
if expired_child:
continue
else:
my_job()