デバッグ—Pythonドキュメント
デバッグ
タスクをリモートでデバッグする(pdbを使用)
基本
celery.contrib.rdb
は、pdb
の拡張バージョンであり、端末にアクセスできないプロセスのリモートデバッグを可能にします。
使用例:
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()
は、現在の場所にブレークポイントを設定し、タスクをリモートでデバッグするためにtelnetで接続できるソケットを作成します。
デバッガーは複数のプロセスによって同時に起動される可能性があるため、固定ポートを使用するのではなく、デバッガーはベースポート(デフォルトでは6900)から開始して使用可能なポートを検索します。 ベースポートは、環境変数 CELERY_RDB_PORT
を使用して変更できます。
デフォルトでは、デバッガーはローカルホストからのみ使用できます。外部からのアクセスを有効にするには、環境変数 CELERY_RDB_HOST
を設定する必要があります。
ワーカーがブレークポイントに遭遇すると、次の情報がログに記録されます。
[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...
指定されたポートにTelnetで接続すると、 pdb シェルが表示されます。
$ telnet localhost 6900
Connected to localhost.
Escape character is '^]'.
> /opt/devel/demoapp/tasks.py(128)add()
-> return result
(Pdb)
help
と入力して、使用可能なコマンドのリストを取得します。これまで pdb を使用したことがない場合は、 Pythonデバッガーマニュアルを読むことをお勧めします。
実例を示すために、result
変数の値を読み取り、それを変更して、タスクの実行を続行します。
(Pdb) result
4
(Pdb) result = 'hello from rdb'
(Pdb) continue
Connection closed by foreign host.
私たちの破壊行為の結果は、労働者のログで見ることができます:
[2011-01-18 14:35:36,599: INFO/MainProcess] Task
tasks.add[d7261c71-4962-47e5-b342-2448bedd20e8] succeeded
in 61.481s: 'hello from rdb'
チップ
ブレークポイント信号の有効化
環境変数 CELERY_RDBSIG
が設定されている場合、ワーカーは SIGUSR2 シグナルが送信されるたびにrdbインスタンスを開きます。 これは、メインプロセスとワーカープロセスの両方に当てはまります。
たとえば、次のコマンドでワーカーを開始します。
$ CELERY_RDBSIG=1 celery worker -l INFO
以下を実行することにより、任意のワーカープロセスのrdbセッションを開始できます。
$ kill -USR2 <pid>