デーモン化—Pythonドキュメント
デーモン化
最近のほとんどの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
で定義されているUser
、Group
、および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としてプロジェクトを実行したときに発生する可能性があります。