如果子进程无法运行命令,则os.fork退出脚本

时间:2016-08-01 17:06:04

标签: python

我是python的新手,尝试使用fork进行多进程。我想做的是在少数主机上运行命令。我可以使用下面的代码,但是如果任何一个孩子无法运行命令或命令本身失败,我也想停止执行。

def runCommand(host,comp):
    if os.system("ssh "+host+" 'somecommand'") != 0:
            print "somecommand failed on "+host+" for "+comp
            sys.exit(-1)

def runMulti():
    children = []
    for comp,host in conHosts.iteritems():
            pid = os.fork()
            if pid:
                    children.append(pid)
            else:
                    sleep(5)
                    runCommand(host,comp)
                    os._exit(0)

    for i, child in enumerate(children):
            os.waitpid(child, 0)

3 个答案:

答案 0 :(得分:0)

您只需检查waitpid的返回值,看看子进程是否退出时状态与0不同:

had_error = any(os.waitpid(child, 0)[1] for child in children)
if had_error:
    sys.exit(1)

注意:由于您要检查os.fork的返回值,因此列表children在子流程中将为空,因此any将始终返回False,即仅主进程最终将调用sys.exit

答案 1 :(得分:0)

os.fork()在子进程中返回0。所以你可以这样做:

if not os.fork():
    # we now know we're the child process
    execute_the_work()
    if failed:
        sys.exit()

sys.exit()是退出python程序的pythonic方法。别忘了import sys

由于您似乎是初学者,请将failed替换为判断任务是否失败的条件。

答案 2 :(得分:0)

我通过使用ThreadPool实现了这一目标。

    pool = ThreadPool(len(hosts))
    try:
            pool.map(runMulti(), 'True')
            pool.close()
            pool.join()
    except:
            os.system('touch /tmp/failed')
            commands.getoutput("killall -q ssh")
            os.kill(os.getpid(),9)

我创建了一个临时文件,当池中的某个线程存在不同的状态时。谢谢大家:)