デーモン化—Pythonドキュメント

提供:Dev Guides
Celery/docs/latest/userguide/daemonizing
移動先:案内検索

デーモン化

最近のほとんどのLinuxディストリビューションは、システムおよびユーザーサービスのライフサイクルを管理するためにsystemdを使用しています。

Linuxディストリビューションがsystemdを使用しているかどうかは、次のように入力して確認できます。

$ systemd --version
systemd 237
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN2 +IDN -PCRE2 default-hierarchy=hybrid

上記のような出力がある場合は、当社のsystemdドキュメントを参照してください。

ただし、systemdは提供するinit.dスクリプトからサービスを自動的に生成するsystemd-sysv互換性レイヤーを提供するため、init.dスクリプトはこれらのLinuxディストリビューションでも機能するはずです。

複数のLinuxディストリビューション用にCeleryをパッケージ化し、一部がsystemdまたは他のUnixシステムもサポートしていない場合は、当社のinit.dドキュメントを参照することをお勧めします。

一般的なinitスクリプト

extra / generic-init.d / ディレクトリのCeleryディストリビューションを参照してください。

このディレクトリには、 celery worker プログラムの一般的なbashinitスクリプトが含まれています。これらは、Linux、FreeBSD、OpenBSD、およびその他のUnixライクなプラットフォームで実行する必要があります。

初期化スクリプト:celeryd

使用法
/etc/init.d/celeryd {start | stop | restart | status}
構成ファイル
/etc/default/celeryd

ワーカーを適切に実行するようにこのスクリプトを構成するには、少なくとも、開始時にディレクトリを変更する場所を指示する必要があります(アプリを含むモジュールまたは構成モジュールを見つけるため)。

デーモン化スクリプトは、ファイル/etc/default/celerydによって構成されます。 これはシェル( sh )スクリプトであり、以下の構成オプションのような環境変数を追加できます。 ワーカーに影響を与える実際の環境変数を追加するには、それらもエクスポートする必要があります(たとえば、 export DISPLAY = ":0"

スーパーユーザー権限が必要です

init-scriptsはrootのみが使用でき、シェル構成ファイルもrootが所有している必要があります。

特権のないユーザーは、init-scriptを使用する必要はありません。代わりに、 celery multi ユーティリティ(または celery worker --detach )を使用できます。

$ celery -A proj multi start worker1 \
    --pidfile="$HOME/run/celery/%n.pid" \
    --logfile="$HOME/log/celery/%n%I.log"

$ celery -A proj multi restart worker1 \
    --logfile="$HOME/log/celery/%n%I.log" \
    --pidfile="$HOME/run/celery/%n.pid

$ celery multi stopwait worker1 --pidfile="$HOME/run/celery/%n.pid"

構成例

これは、Pythonプロジェクトの構成例です。

/etc/default/celeryd

# Names of nodes to start
#   most people will only start one node:
CELERYD_NODES="worker1"
#   but you can also start multiple and configure settings
#   for each in CELERYD_OPTS
#CELERYD_NODES="worker1 worker2 worker3"
#   alternatively, you can specify the number of nodes to start:
#CELERYD_NODES=10

# Absolute or relative path to the 'celery' command:
CELERY_BIN="/usr/local/bin/celery"
#CELERY_BIN="/virtualenvs/def/bin/celery"

# App instance to use
# comment out this line if you don't use an app
CELERY_APP="proj"
# or fully qualified:
#CELERY_APP="proj.tasks:app"

# Where to chdir at start.
CELERYD_CHDIR="/opt/Myproject/"

# Extra command-line arguments to the worker
CELERYD_OPTS="--time-limit=300 --concurrency=8"
# Configure node-specific settings by appending node name to arguments:
#CELERYD_OPTS="--time-limit=300 -c 8 -c:worker2 4 -c:worker3 2 -Ofair:worker1"

# Set logging level to DEBUG
#CELERYD_LOG_LEVEL="DEBUG"

# %n will be replaced with the first part of the nodename.
CELERYD_LOG_FILE="/var/log/celery/%n%I.log"
CELERYD_PID_FILE="/var/run/celery/%n.pid"

# Workers should run as an unprivileged user.
#   You need to create this user manually (or you can choose
#   a user/group combination that already exists (e.g., nobody).
CELERYD_USER="celery"
CELERYD_GROUP="celery"

# If enabled pid and log directories will be created if missing,
# and owned by the userid/group configured.
CELERY_CREATE_DIRS=1

ログインシェルの使用

ログインシェルを使用して、CELERYD_USERの環境を継承できます。

CELERYD_SU_ARGS="-l"

これは推奨されておらず、絶対に必要な場合にのみこのオプションを使用する必要があることに注意してください。


Django構成の例

Djangoユーザーは上記とまったく同じテンプレートを使用するようになりましたが、Celeryアプリインスタンスを定義するモジュールが DJANGO_SETTINGS_MODULE)。 X215X] Django の最初のステップ。


利用可能なオプション

  • CELERY_APP

    使用するアプリインスタンス(--app引数の値)。

  • CELERY_BIN

    celery プログラムへの絶対パスまたは相対パス。 例:

    • celery

    • /usr/local/bin/celery

    • /virtualenvs/proj/bin/celery

    • /virtualenvs/proj/bin/python -m celery


  • CELERYD_NODES

    開始するノード名のリスト(スペースで区切ります)。

  • CELERYD_OPTS

    ワーカーの追加のコマンドライン引数。リストについては、 celery worker –help を参照してください。 これは、 multi が個々のノードの設定を構成するために使用する拡張構文もサポートします。 マルチノード構成の例については、 celery multi –help を参照してください。

  • CELERYD_CHDIR

    開始時にディレクトリを変更するパス。 デフォルトでは、現在のディレクトリにとどまります。

  • CELERYD_PID_FILE

    PIDファイルへのフルパス。 デフォルトは/var/run/celery/%n.pidです。

  • CELERYD_LOG_FILE

    ワーカーログファイルへのフルパス。 デフォルトは/var/log/celery/%n%I.logです:プリフォークプールを使用する場合は、%I を使用することが重要です。これは、複数のプロセスが同じログファイルを共有すると発生するためです。競合状態に。

  • CELERYD_LOG_LEVEL

    ワーカーログレベル。 デフォルトはINFOです。

  • CELERYD_USER

    ワーカーを実行するユーザー。 デフォルトは現在のユーザーです。

  • CELERYD_GROUP

    ワーカーを実行するグループ。 デフォルトは現在のユーザーです。

  • CELERY_CREATE_DIRS

    常にディレクトリ(ログディレクトリとpidファイルディレクトリ)を作成します。 デフォルトでは、カスタムログファイル/ pidfileが設定されていない場合にのみディレクトリが作成されます。

  • CELERY_CREATE_RUNDIR

    常にpidfileディレクトリを作成します。 デフォルトでは、カスタムpidfileの場所が設定されていない場合にのみ有効になります。

  • CELERY_CREATE_LOGDIR

    常にログファイルディレクトリを作成します。 デフォルトでは、カスタムログファイルの場所が設定されていない場合にのみ有効になります。


初期化スクリプト:celerybeat

使用法
/etc/init.d/celerybeat {start | stop | restart}
構成ファイル
/etc/default/celerybeatまたは/etc/default/celeryd

構成例

これは、Pythonプロジェクトの構成例です。

/ etc / default / celerybeat :

# Absolute or relative path to the 'celery' command:
CELERY_BIN="/usr/local/bin/celery"
#CELERY_BIN="/virtualenvs/def/bin/celery"

# App instance to use
# comment out this line if you don't use an app
CELERY_APP="proj"
# or fully qualified:
#CELERY_APP="proj.tasks:app"

# Where to chdir at start.
CELERYBEAT_CHDIR="/opt/Myproject/"

# Extra arguments to celerybeat
CELERYBEAT_OPTS="--schedule=/var/run/celery/celerybeat-schedule"

Django構成の例

上記と同じテンプレートを使用する必要がありますが、DJANGO_SETTINGS_MODULE変数が設定(およびエクスポート)され、CELERYD_CHDIRがプロジェクトディレクトリに設定されていることを確認してください。

export DJANGO_SETTINGS_MODULE="settings"

CELERYD_CHDIR="/opt/MyProject"

利用可能なオプション

  • CELERY_APP

    使用するアプリインスタンス(--app引数の値)。

  • CELERYBEAT_OPTS

    celery beat に対する追加の引数。使用可能なオプションのリストについては、 celery beat --help を参照してください。

  • CELERYBEAT_PID_FILE

    PIDファイルへのフルパス。 デフォルトは/var/run/celeryd.pidです。

  • CELERYBEAT_LOG_FILE

    ログファイルへのフルパス。 デフォルトは/var/log/celeryd.logです。

  • CELERYBEAT_LOG_LEVEL

    使用するログレベル。 デフォルトはINFOです。

  • CELERYBEAT_USER

    ビートを実行するユーザー。 デフォルトは現在のユーザーです。

  • CELERYBEAT_GROUP

    ビートを実行するグループ。 デフォルトは現在のユーザーです。

  • CELERY_CREATE_DIRS

    常にディレクトリ(ログディレクトリとpidファイルディレクトリ)を作成します。 デフォルトでは、カスタムログファイル/ pidfileが設定されていない場合にのみディレクトリが作成されます。

  • CELERY_CREATE_RUNDIR

    常にpidfileディレクトリを作成します。 デフォルトでは、カスタムpidfileの場所が設定されていない場合にのみ有効になります。

  • CELERY_CREATE_LOGDIR

    常にログファイルディレクトリを作成します。 デフォルトでは、カスタムログファイルの場所が設定されていない場合にのみ有効になります。


トラブルシューティング

init-scriptsを機能させることができない場合は、詳細モードで実行してみてください。

# sh -x /etc/init.d/celeryd start

これにより、サービスが開始されない理由に関するヒントが明らかになります。

ワーカーが「OK」で始まり、ほぼ直後に終了し、ログファイルに証拠がない場合は、エラーが発生している可能性がありますが、デーモンの標準出力はすでに閉じられているため、表示できません。それらはどこにでもあります。 この状況では、 C_FAKEFORK環境変数を使用して、デーモン化の手順をスキップできます。

# C_FAKEFORK=1 sh -x /etc/init.d/celeryd start

これで、エラーを確認できるはずです。

一般に、このようなエラーは、ファイルからの読み取りまたはファイルへの書き込みに対する不十分なアクセス許可によって引き起こされます。また、構成モジュール、ユーザーモジュール、サードパーティライブラリ、またはCelery自体からの構文エラーによっても発生します(バグを見つけた場合は、 報告してください)。


使用法systemd

使用法
systemctl {start | stop | restart | status} celery.service
構成ファイル
/etc/conf.d/celery

サービスファイル:celery.service

これはsystemdファイルの例です:

/etc/systemd/system/celery.service

[Unit]
Description=Celery Service
After=network.target

[Service]
Type=forking
User=celery
Group=celery
EnvironmentFile=/etc/conf.d/celery
WorkingDirectory=/opt/celery
ExecStart=/bin/sh -c '${CELERY_BIN} -A $CELERY_APP multi start $CELERYD_NODES \
    --pidfile=${CELERYD_PID_FILE} --logfile=${CELERYD_LOG_FILE} \
    --loglevel="${CELERYD_LOG_LEVEL}" $CELERYD_OPTS'
ExecStop=/bin/sh -c '${CELERY_BIN} multi stopwait $CELERYD_NODES \
    --pidfile=${CELERYD_PID_FILE} --loglevel="${CELERYD_LOG_LEVEL}"'
ExecReload=/bin/sh -c '${CELERY_BIN} -A $CELERY_APP multi restart $CELERYD_NODES \
    --pidfile=${CELERYD_PID_FILE} --logfile=${CELERYD_LOG_FILE} \
    --loglevel="${CELERYD_LOG_LEVEL}" $CELERYD_OPTS'
Restart=always

[Install]
WantedBy=multi-user.target

そのファイルを/etc/systemd/systemに配置したら、Systemdがそのファイルを確認するために、 systemctldaemon-reload を実行する必要があります。 また、コマンドを変更するたびにそのコマンドを実行する必要があります。 システムの(再)起動時にセロリサービスを自動的に開始する場合は、 systemctl enable celery.service を使用します。

オプションで、セロリサービスの追加の依存関係を指定できます。 RabbitMQをブローカーとして使用する場合は、[Unit] systemdセクションAfter=Requires=の両方でrabbitmq-server.serviceを指定できます。

ユーザー、グループ、 chdir を構成するには、/etc/systemd/system/celery.serviceで定義されているUserGroup、およびWorkingDirectoryの設定を変更します。

systemd-tmpfilesを使用して、作業ディレクトリ(ログおよびpid用)を作成することもできます。

ファイル
/etc/tmpfiles.d/celery.conf
d /run/celery 0755 celery celery -
d /var/log/celery 0755 celery celery -

構成例

これは、Pythonプロジェクトの構成例です。

/etc/conf.d/celery

# Name of nodes to start
# here we have a single node
CELERYD_NODES="w1"
# or we could have three nodes:
#CELERYD_NODES="w1 w2 w3"

# Absolute or relative path to the 'celery' command:
CELERY_BIN="/usr/local/bin/celery"
#CELERY_BIN="/virtualenvs/def/bin/celery"

# App instance to use
# comment out this line if you don't use an app
CELERY_APP="proj"
# or fully qualified:
#CELERY_APP="proj.tasks:app"

# How to call manage.py
CELERYD_MULTI="multi"

# Extra command-line arguments to the worker
CELERYD_OPTS="--time-limit=300 --concurrency=8"

# - %n will be replaced with the first part of the nodename.
# - %I will be replaced with the current child process index
#   and is important when using the prefork pool to avoid race conditions.
CELERYD_PID_FILE="/var/run/celery/%n.pid"
CELERYD_LOG_FILE="/var/log/celery/%n%I.log"
CELERYD_LOG_LEVEL="INFO"

# you may wish to add these options for Celery Beat
CELERYBEAT_PID_FILE="/var/run/celery/beat.pid"
CELERYBEAT_LOG_FILE="/var/log/celery/beat.log"

サービスファイル:celerybeat.service

これは、CeleryBeatのsystemdファイルの例です。

/etc/systemd/system/celerybeat.service

[Unit]
Description=Celery Beat Service
After=network.target

[Service]
Type=simple
User=celery
Group=celery
EnvironmentFile=/etc/conf.d/celery
WorkingDirectory=/opt/celery
ExecStart=/bin/sh -c '${CELERY_BIN} -A ${CELERY_APP} beat  \
    --pidfile=${CELERYBEAT_PID_FILE} \
    --logfile=${CELERYBEAT_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL}'
Restart=always

[Install]
WantedBy=multi-user.target

そのファイルを/etc/systemd/systemに配置したら、Systemdがそのファイルを確認するために、 systemctldaemon-reload を実行する必要があります。 また、コマンドを変更するたびにそのコマンドを実行する必要があります。 システムの(再)起動時にセロリビートサービスを自動的に開始する場合は、 systemctl enable celerybeat.service を使用します。


スーパーユーザー権限(root)でワーカーを実行する

スーパーユーザー権限でワーカーを実行することは、非常に危険な方法です。 rootとして実行しないようにするには、常に回避策が必要です。 Celeryは、pickleでシリアル化されたメッセージで任意のコードを実行する可能性があります。これは、特にrootとして実行する場合は危険です。

デフォルトでは、Celeryはワーカーをrootとして実行しません。 関連するエラーメッセージはログに表示されない場合がありますが、 C_FAKEFORKが使用されている場合は表示される場合があります。

Celeryに強制的にワーカーをルートとして実行するには、 C_FORCE_ROOTを使用します。

C_FORCE_ROOTなしでルートとして実行すると、ワーカーは「OK」で始まるように見えますが、明らかなエラーなしですぐに終了します。 この問題は、新しい開発環境または本番環境で(うっかりして)rootとしてプロジェクトを実行したときに発生する可能性があります。


:pypi: `スーパーバイザー`


launchd(macOS)