2017-07-16 33 views
0

我正在使用Celery來設置使用Fabric的遠程服務器。爲什麼我不能抓到芹菜的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我故意給它一個1.2.3.4以ssh不存在。這應該是來自織物的錯誤 – Sparrowcide

+0

回答了一個答案,讓我知道這是否有效。 – lpiner

回答

0

從文檔你應該得到一個celery.result.EagerResult對象從celery.execute回來,所以即使它失敗了,我不認爲它會引發一個錯誤,除非你告訴它。我不認爲你需要通過自己來執行。

也似乎是從像芹菜2,你應該考慮更新。

試試看。

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

相關問題