Linux中的Python:使用shell终止进程和子进程

时间:2016-05-23 09:00:38

标签: python linux shell

问:鉴于一个运行另一个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)

现在,当我想杀死这个过程及其子女时,我:

  1. 运行"ps -ef | grep python"以获取pids。
  2. 运行kill -9 <pid>以终止进程。
  3. 结果:在分配新的pid后,流程继续运行。

    是否有一种优雅的方法可以让进程在被杀时正常退出?

2 个答案:

答案 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)

在此代码中,父级将等待子级的退出状态。如果父级正在获得其存在状态,则只有它将继续进行下一次迭代。

此外,您无法抓住SIGKILLSIGKILLSIGSTOP是无法捕获的信号)

-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()