使用os.sytem()

时间:2017-03-29 09:02:31

标签: python subprocess signals os.system

我有两个python脚本,如下所示 -

parent.py

import os
import signal


shutdown = False

def sigterm_handler(signum, frame):
    global shutdown
    shutdown = True

if __name__ == '__main__':
    signal.signal(signal.SIGTERM, sigterm_handler)
    signal.signal(signal.SIGINT, sigterm_handler)
    os.chdir(os.path.dirname(os.path.abspath(__file__)))
    cmd = 'python child.py'
    while True:
        if shutdown == True:
            break
        print 'executing %s' % cmd
        exit_code = os.system(cmd)
        print 'Exit Code from %s > %s' % (cmd, exit_code)    
    print 'Exiting Parent'    

child.py

import signal
import time

shutdown = False

def sigterm_handler(signum, frame):
    global shutdown
    shutdown = True

if __name__ == '__main__':
    signal.signal(signal.SIGTERM, sigterm_handler)
    signal.signal(signal.SIGINT, sigterm_handler)
    while True:
        if shutdown == True:
            break
        print 'Child Process Running !!'
        time.sleep(1)  

如果我运行parent.py并在终端上按ctrl + c,子进程退出并由父进程重新启动,因为父进程未处理SIGINT没有被父进程处理。如果在终端上按下ctrl + c,我想终止父和子。但是对于因为某些错误而不是ctrl + c事件而退出子进程的情况,我希望父进程继续执行。我本可以在父母中处理SIGCHLD,但这并不表示孩子是否因为ctrl + c事件或其他事件而退出。我将如何实现这种行为?

下面的

是我运行父 -

时得到的输出
executing python child.py
Child Process Running !!
Child Process Running !!
Child Process Running !!
Child Process Running !!
^CExit Code from python child.py > 2
executing python child.py
Child Process Running !!
Child Process Running !!
Child Process Running !!
Child Process Running !!
Child Process Running !!
^CExit Code from python child.py > 2
executing python child.py
Child Process Running !!
Child Process Running !!
Child Process Running !!
Child Process Running !!
^CExit Code from python child.py > 2
............................
............................

1 个答案:

答案 0 :(得分:0)

我认为subprocessos.system好运。特别是,我认为您将subprocessshell=False一起使用,以便在没有子shell的情况下执行子命令(这可能会影响您处理这些信号处理方案的能力)。

如果我理解正确的话,下面的代码可以满足您的需求:CTRL-C会导致孩子和父母停止;但如果孩子因某种原因死亡,父母会再次经营孩子。

这是一个类似于你的父程序:

import signal
import subprocess

shutdown = False

def sigterm_handler(signum, frame):
    print 'parent got shutdown'
    global shutdown
    shutdown = True

if __name__ == '__main__':
    signal.signal(signal.SIGTERM, sigterm_handler)
    signal.signal(signal.SIGINT, sigterm_handler)
    cmd_args = ['python', 'child.py']
    while not shutdown:
        print 'executing', cmd_args
        try:
            subprocess.check_call(cmd_args)
        except subprocess.CalledProcessError:
            print 'child died'
            pass
    print 'Exiting Parent'

这是一个运行一段时间然后因ZeroDivisionError而死的子程序。

import signal
import sys
import time

def sigterm_handler(signum, frame):
    print 'child got shutdown'
    sys.exit(0)

if __name__ == '__main__':
    signal.signal(signal.SIGTERM, sigterm_handler)
    signal.signal(signal.SIGINT, sigterm_handler)
    for i in range(3, -1, -1):
        print 'Child Process Running', i, i/i
        time.sleep(3)