2017-07-16 7 views
0

私はファブリックを使用してリモートサーバーを設定するためにCeleryを使用しています。なぜCeleryのWorkerLostErrorを捕まえられないのですか?

私はServer.statusを(ダブルランニングを防ぐために)起動し、Server.statusをエラーになるように変更したいと思います。私のコードを見てください:

class ChangeBackStatusOnErrorTask(celery.Task): 
    abstract = True 

    def on_failure(self, exc, task_id, args, kwargs, einfo): 
    print 'from on_failue', self, exc, task_id, args, kwargs, einfo 
    return 
    #server = Server.query.get(server_id) 
    #server.status = RemoteStatus.ERROR 
    #db.session.commit() 


@celery.task(bind=True, base=ChangeBackStatusOnErrorTask) 
def deploy_server(self, server_id): 
    """To prevent launching while we are launching, we will 
    disable launching until the server's status is LAUNCHED 
    """ 
    server = Server.query.get(server_id) 
    if not server.can_launch(): 
    return 

    try: 
    server.status = RemoteStatus.LAUNCHING 
    db.session.commit() 

    host = server.ssh_user + '@' + server.ip 
    execute(fabric_deploy_server, self, server, hosts=host) 

    server.status = RemoteStatus.LAUNCHED 
    db.session.commit() 
    except Exception as e: 
    server.status = RemoteStatus.ERROR 
    db.session.commit() 
    traceback.print_exc() 
    raise e 

私はセロリのタスクに誤ったIPアドレスを供給する場合しかし、私はすべての障害処理メカニズムを回避例外が発生することができる午前:

[2017-07-17 03:58:07,077: WARNING/PoolWorker-7] [[email protected]] Executing task 'fabric_deploy_server' 
[2017-07-17 03:58:07,078: WARNING/PoolWorker-7] [[email protected]] sudo: apt-get update 
[2017-07-17 03:58:17,173: WARNING/PoolWorker-7] Fatal error: Timed out trying to connect to 1.2.3.45 (tried 1 time) 

Underlying exception: 
    timed out 
[2017-07-17 03:58:17,173: WARNING/PoolWorker-7] Aborting. 
[2017-07-17 03:58:22,172: ERROR/MainProcess] Task handler raised error: WorkerLostError('Worker exited prematurely: exitcode 0.',) 
Traceback (most recent call last): 
    File "/Users/vng/.virtualenvs/AutomataHeroku/lib/python2.7/site-packages/billiard/pool.py", line 1224, in mark_as_worker_lost 
    human_status(exitcode)), 
WorkerLostError: Worker exited prematurely: exitcode 0. 

として

  1. ChangeBackStatusOnErrorTask.on_failureが表示されませんでした。
  2. この例外は、Try/Catchブロックをエスケープしました。

どのようにこのエラーをキャッチできますか?私は自分の仕事を再開できるようにServer.statusをERRORに設定する必要があります。

+0

これは何セロリのバージョンですか? (3の場合は4にアップグレードすることができます)。どのようにあなたの労働者は死んでいる、それは用語のシグナルを取得している/殺すか、ちょうどクラッシュ? – lpiner

+0

@lpiner私は故意にそれが存在しないsshに対して1.2.3.4を与えました。それはファブリックからのエラーでなければなりません – Sparrowcide

+0

答えに亀裂を与えました。 – lpiner

答えて

0

celery.result.EagerResultオブジェクトはcelery.executeから戻ってくるはずです。失敗したとしても、それを伝えなければエラーは発生しません。私はどちらかを実行するために自己を渡す必要はないと思う。

また、celery2のように実行されているようですが、実際に更新を検討する必要があります。

これを試してください。

try: 
    server.status = RemoteStatus.LAUNCHING 
    db.session.commit() 

    host = server.ssh_user + '@' + server.ip 
    # Apply will run locally. 
    # http://docs.celeryproject.org/en/2.1-archived/reference/celery.execute.html#executing-tasks-celery-execute 
    # Throw=True will re-raise the error if you get one. 
    result = execute.apply(fabric_deploy_server, server, hosts=host, throw=True) 

    server.status = RemoteStatus.LAUNCHED 
    db.session.commit() 
    except Exception as e: 
    server.status = RemoteStatus.ERROR 
    db.session.commit() 
    traceback.print_exc() 
    raise e 

セロリhttp://docs.celeryproject.org/en/2.1-archived/reference/celery.execute.html#executing-tasks-celery-execute

セロリイーガーの検索結果を実行しhttp://docs.celeryproject.org/en/2.1-archived/reference/celery.result.html#celery.result.EagerResult

関連する問題