# Celery_Debugging ###### tags: `celery` `celery 5.2` `python` [官方連結_Debugging](https://docs.celeryq.dev/en/master/userguide/debugging.html) ## Debugging ### Debugging Tasks Remotely (using pdb) #### Basics [celery.contrib.rdb](https://docs.celeryq.dev/en/master/reference/celery.contrib.rdb.html#module-celery.contrib.rdb)是[pdb](https://docs.python.org/dev/library/pdb.html#module-pdb)的擴展版本,允許對沒有終端存取權限的進程(process)進行遠端除錯。 使用範例: ```python from celery import task from celery.contrib import rdb @task() def add(x, y): result = x + y rdb.set_trace() # <- set break-point return result ``` [set_trace()](https://docs.celeryq.dev/en/master/reference/celery.contrib.rdb.html#celery.contrib.rdb.set_trace),在當前位置設置一個中斷點(break-point),然後建立一個可以遠端登入並且針對任務除錯的socket。 除錯工具可能會被多個processes同時啟動,因此除錯工具會從基本埠開始搜尋可用的埠(預設由6900開始),而不是固定埠。基本埠可以用環境變數[CELERY_RDB_PORT](https://docs.celeryq.dev/en/master/reference/celery.contrib.rdb.html#envvar-CELERY_RDB_PORT)來調整。 預設情況下,除錯工具僅可以在本機使用,如果要從外部登入,你必須設置環境變數[CELERY_RDB_HOST](https://docs.celeryq.dev/en/master/reference/celery.contrib.rdb.html#envvar-CELERY_RDB_HOST) 當Worker遇到設置的中斷點,它將記錄下列資訊: :::info [INFO/MainProcess] Received task: tasks.add[d7261c71-4962-47e5-b342-2448bedd20e8] [WARNING/PoolWorker-1] Remote Debugger:6900: Please telnet 127.0.0.1 6900. Type `exit` in session to continue. [2011-01-18 14:25:44,119: WARNING/PoolWorker-1] Remote Debugger:6900: Waiting for client... ::: 如果你通過指定埠做終端登錄,你將會看到`pdb` shell: ```shell $ telnet localhost 6900 Connected to localhost. Escape character is '^]'. > /opt/devel/demoapp/tasks.py(128)add() -> return result (Pdb) ``` 輸入`help`就可以取得可用的命令列表,如果你從來沒有使用過`pdb`,那閱讀[Python Debugger Manual](https://docs.python.org/3/library/pdb.html)或許是個不錯的選擇。 為了演示,我們會讀取變數`result`的值,改變它,然後繼續執行任務: ```python (Pdb) result 4 (Pdb) result = 'hello from rdb' (Pdb) continue Connection closed by foreign host. ``` 我們變更`result`的行為可以在Worker的日誌上看的到: ```shell [2011-01-18 14:35:36,599: INFO/MainProcess] Task tasks.add[d7261c71-4962-47e5-b342-2448bedd20e8] succeeded in 61.481s: 'hello from rdb' ``` ### Tips #### Enabling the break-point signal 如果環境變數**CELERY_RDBSIG**已經設置了,那Worker會開啟一個`rdb`實例,不論`SIGUSR2`這個信號(signal)是否發送。主要的process與Worker process都是這種情況。 舉例來說,啟動Worker: ```shell $ CELERY_RDBSIG=1 celery worker -l info ``` 你可以透過下面的執行對任何一個Worker process啟動一個`rdb session`: ```shell $ kill -USR2 <pid> ``` ## History 20190923_依據4.4版本說明翻譯 20220523_依據5.2版本說明翻譯