2016-08-01 18 views
0

私は、forkで複数のプロセスを使用しようとしているpythonの初心者です。私がしたかったのは、いくつかのホストでコマンドを実行することでした。私は以下のコードで行うことができますが、子のいずれかがコマンドの実行に失敗した場合、またはコマンド自体が失敗した場合にも実行を停止したいと考えています。os.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) 
+0

コードが動作するかどうか、そしてなぜかって? –

+0

これはコードreview.se –

+0

あなたのインデントが奇妙です –

答えて

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) 

私はプール内のスレッドが異なるstatus.Thankであなたのすべてを存在する場合、一時ファイルを作成している:)

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を呼び出します。

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プログラムを終了するにはニシキヘビの方法です。 import sysを忘れないでください。

初心者のようですので、failedを条件に置き換えて、タスクが失敗したかどうかを判断してください。

+0

['os._exit'](https://docs.python.org/3.5/library/os .export()は、通常、fork()の後の子プロセスでのみ使用されるべきです。 () '**"つまり、OPのコードは完璧です。 – Bakuriu

関連する問題