celery不能以守护进程方式运行自己,需要使用下面的工具:
通用的初始化脚本
脚本代码:extra/generic-init.d/
这个目录包含了celery worker程序通用的初始化脚本,这些脚本应该运行在Linux,FreeBSD,OpenBSD和其它类UNIX平台。
初始化脚本:celeryd
使用方法:/etc/init.d/celeryd {start|stop|restart|status}
配置文件:/etc/default/celeryd
要配置这个脚本能够正常运行你的worker,你至少需要配置worker启动后需要使用的目录(查找包含app的模块和你的配置模块)。
worker守护化的配置脚本为/etc/default/celeryd,这是一个shell脚本。你可以为这个脚本添加环境变量和配置选项。添加了环境变量之后,你必须export它们(比如 export DISPLAY=":0")。
需要管理员权限
初始化脚本和配置脚本必须使用root用户。
权限不足的用户不能够使用初始化脚本,他们可以使用celery multi工具(或者celery worker --detach)。
$ celery multi start worker1 \ -A proj \ --pidfile="$HOME/run/celery/%n.pid" \ --logfile="$HOME/log/celery/%n%I.log" $ celery multi restart worker1 \ -A proj \ --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 (see `celery multi --help` for examples): #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" # 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使用登陆shell
你可以通过使用登陆shell来继承CELERYD_USER环境变量。
CELERYD_SU_ARGS="-l"注意,并不建议这样使用,只有当必须这样做时再这样使用。
Django配置举例
Django用户现在可以使用上面示例的模版,但是要确保定义celery app实例的模块也为DJANGO_SETTINGS_MODULE设置
了一个默认值,可以参考: First steps with Django.
可用的选项
CELERY_APP
使用的app实例(app参数的值).如果你还在使用老的API或者django-celery,你可以省略这个配置。
CELERY_BIN
celery程序的绝对或者相对路径.比如:
celery
/usr/local/bin/celery
/virtualenvs/proj/bin/celery
/virtualenvs/proj/bin/python -m celery
启动的节点列表(以空格分隔)
CELERY_OPTS
worker的其它命令行参数,通过celery -help查看参数列表。这个选项还支持multi的扩展语法用来配置私有节点的配置。通过celery multi --help来查看多节点的的配置举例。
CELERY_CHDIR
启动后改变到的目录,默认为当前目录。
CELERYD_PID_FILE
PID文件的全路径,默认为/var/run/celery/%n.pid
CELERY_LOG_FILE
worker日志文件的全路径。默认为/var/log/celery/%n%I.log.注意:使用%I是重要的,因为prefork池中的多个进程如果使用相同的日志文件将会产生竞争。
CELERY_LOG_LEVEL
worker的日志级别,默认为INFO
CELERYD_USER
运行worker的用户,默认为当前用户
CELERYD_GROUP
运行worker的组,默认为当前组
CELERY_CREATE_DIRS
总是创建目录(日志目录和pid文件目录)。默认只在指定了logfile/pidfile时创建目录。
CELERY_CREATE_RUNDIR
总是创建pidfile目录,默认只在指定了pidfile位置时创建。
CELERY_CREATE_LOGDIR
总是创建logfile目录,默认只在指定logfile位置时创建。
初始化脚本:celerybeat
使用方法:
/etc/init.d/celerybeat {start|stop|restart} |
/etc/default/celerybeat or /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配置举例
export DJANGO_SETTINGS_MODULE="settings" CELERYD_CHDIR="/opt/MyProject"可用的选项
CELERY_APP
使用的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
运行beat的用户,默认为当前用户
CELERYBEAT_GROUP
运行beat的组,默认为当前组
CELERY_CREATE_DIRS
总是创建目录(日志目录和pid文件目录)。默认只在指定了logfile/pidfile时创建目录。
CELERY_CREATE_RUNDIR
总是创建pidfile目录,默认只在指定了pidfile位置时创建。
CELERY_CREATE_LOGDIR
总是创建logfile目录,默认只在指定logfile位置时创建。
问题排查
如果你不能让初始化脚本正常运行,你可以尝试以详细模式来运行:
# sh -x /etc/init.d/celeryd start
这会显示一些为什么不能运行的的提示信息
如果worker启动时显示ok,但是很快就退出了,这样日志文件中不会有任何信息,可能启动过程中有错误。但是以守护进程方式运行时,标准输出被关闭了,你就看不到任何信息了。如果遇到这种情况,你可以使用C_FAKEFORK环境变量来跳过守护进程方式:
# C_FAKEFORK=1 sh -x /etc/init.d/celeryd start这样你就可以看到错误了。
通常情况下,错误是由于读或者写文件权限不足造成的,也有可能是配置模块,用户模块或者第三库中有语法错误,甚至是celery自身的错误(如果你发现了bug,请报告它)
使用systemd
配置文件:
/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 '${CELERY_BIN} multi start $CELERYD_NODES \ -A $CELERY_APP --logfile=${CELERYD_LOG_FILE} \ --pidfile=${CELERYD_PID_FILE} $CELERYD_OPTS' ExecStop=/bin/sh '${CELERY_BIN} multi stopwait $CELERYD_NODES \ --pidfile=${CELERYD_PID_FILE}' ExecReload=/bin/sh '${CELERY_BIN} multi restart $CELERYD_NODES \ -A $CELERY_APP --pidfile=${CELERYD_PID_FILE} --logfile=${CELERYD_LOG_FILE} \ --loglevel="${CELERYD_LOG_LEVEL}" $CELERYD_OPTS' [Install] WantedBy=multi-user.target当你将上面的文件放到/etc/systemd/system目录后,你需要运行systemctl daemon-reload来让systemd识别这个文件。在你修改了这个文件后,你也需要重新运行这个命令。
要配置用户,组,chdir等配置,请修改配置文件中的User,Group,WorkingDirectory选项。
你还可以使用systemd-tmpfiles来创建工作目录(用于日志和pid)
文件:/etc/tmpfiles.d/celery.conf:
d /var/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" # 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_LOG_FILE="/var/log/celery/%n%I.log" CELERYD_PID_FILE="/var/run/celery/%n.pid"Django配置举例
下面是一个使用django-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 path to "manage.py" CELERY_BIN="/opt/Myproject/manage.py" # How to call manage.py CELERYD_MULTI="celery 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 CELERYD_LOG_FILE="/var/log/celery/%n%I.log" CELERYD_PID_FILE="/var/run/celery/%n.pid"通过在celery.services里使用环境变量来添加类似DJANGO_SETTINGS_MODULE的环境变量。
以超级用户(root)身份运行worker:
以超级用户身份运行worker是一个非常危险的举动。总会有一种解决方案来避免使用root。Celery在用pickle作消息序列化时可能运行任意的代码----------这很危险,尤其是用root用户时。
默认情况下,celery不会用root用户运行worker.相关的错误信息在日志可能不可见,除非你使用了C_FAKEFORK。
使用C_FORCE_ROOT来强制celery使用root用户来运行worker。
当使用C_FORCE_ROOT来运行worker时,可能会出现"OK"后直接退出且没有任何错误的情况。这可能是由于不经意间使用root用户运行工程在一个新的开发环境或者生产环境。
launchd
(OS X)
http://www.calazan.com/windows-tip-run-applications-in-the-background-using-task-scheduler/