Celery in daemon mode

匿名 (未验证) 提交于 2019-12-03 03:03:02

问题:

I use GNU screen for running Celery in console mode, but it's a hack I don't want to use on prodution server. I want to know how to daemonize Celery.

I have virtualenv with celery set up. I want to run %venv%/bin/celeryd in daemon mode. I tried ./celeryd start and got:

Unrecognized command line arguments: start 

What else I should try to run it in daemon mode?

回答1:

Try this /etc/init.d/celeryd script.

#!/bin/sh -e ### BEGIN INIT INFO # Provides:          celeryd # Required-Start:    $network $local_fs $remote_fs # Required-Stop:     $network $local_fs $remote_fs # Default-Start:     2 3 4 5 # Default-Stop:      0 1 6 # Short-Description: celery task worker daemon ### END INIT INFO  # ============================================ #  celeryd - Starts the Celery worker daemon. # ============================================ # # :Usage: /etc/init.d/celeryd {start|stop|force-reload|restart|try-restart|status} # :Configuration file: /etc/default/celeryd # # See http://docs.celeryproject.org/en/latest/tutorials/daemonizing.html#generic-init-scripts   # some commands work asyncronously, so we'll wait this many seconds SLEEP_SECONDS=5  DEFAULT_PID_FILE="/var/run/celery/%n.pid" DEFAULT_LOG_FILE="/var/log/celery/%n.log" DEFAULT_LOG_LEVEL="INFO" DEFAULT_NODES="celery" DEFAULT_CELERYD="-m celery.bin.celeryd_detach"  CELERY_DEFAULTS=${CELERY_DEFAULTS:-"/etc/default/celeryd"}  test -f "$CELERY_DEFAULTS" && . "$CELERY_DEFAULTS"  # Set CELERY_CREATE_DIRS to always create log/pid dirs. CELERY_CREATE_DIRS=${CELERY_CREATE_DIRS:-1} CELERY_CREATE_RUNDIR=$CELERY_CREATE_DIRS CELERY_CREATE_LOGDIR=$CELERY_CREATE_DIRS if [ -z "$CELERYD_PID_FILE" ]; then     CELERYD_PID_FILE="$DEFAULT_PID_FILE"     CELERY_CREATE_RUNDIR=1 fi if [ -z "$CELERYD_LOG_FILE" ]; then     CELERYD_LOG_FILE="$DEFAULT_LOG_FILE"     CELERY_CREATE_LOGDIR=1 fi  CELERYD_LOG_LEVEL=${CELERYD_LOG_LEVEL:-${CELERYD_LOGLEVEL:-$DEFAULT_LOG_LEVEL}} CELERYD_MULTI=${CELERYD_MULTI:-"celeryd-multi"} CELERYD=${CELERYD:-$DEFAULT_CELERYD} CELERYD_NODES=${CELERYD_NODES:-$DEFAULT_NODES}  export CELERY_LOADER  if [ -n "$2" ]; then     CELERYD_OPTS="$CELERYD_OPTS $2" fi  CELERYD_LOG_DIR=`dirname $CELERYD_LOG_FILE` CELERYD_PID_DIR=`dirname $CELERYD_PID_FILE`  # Extra start-stop-daemon options, like user/group. SUDOCMD="" if [ -n "$CELERYD_USER" ]; then     #DAEMON_OPTS="$DAEMON_OPTS --uid=$CELERYD_USER"     SUDOCMD="sudo -u $CELERYD_USER "     CELERYD_MULTI="$SUDOCMD $CELERYD_MULTI" fi if [ -n "$CELERYD_GROUP" ]; then     DAEMON_OPTS="$DAEMON_OPTS --gid=$CELERYD_GROUP" fi  if [ -n "$CELERYD_CHDIR" ]; then     DAEMON_OPTS="$DAEMON_OPTS --workdir=$CELERYD_CHDIR" fi   check_dev_null() {     if [ ! -c /dev/null ]; then         echo "/dev/null is not a character device!"         exit 75  # EX_TEMPFAIL     fi }   maybe_die() {     if [ $? -ne 0 ]; then         echo "Exiting: $* (errno $?)"         exit 77  # EX_NOPERM     fi }  create_default_dir() {     if [ ! -d "$1" ]; then         echo "- Creating default directory: '$1'"         mkdir -p "$1"         maybe_die "Couldn't create directory $1"         echo "- Changing permissions of '$1' to 02755"         chmod 02755 "$1"         maybe_die "Couldn't change permissions for $1"         if [ -n "$CELERYD_USER" ]; then             echo "- Changing owner of '$1' to '$CELERYD_USER'"             chown "$CELERYD_USER" "$1"             maybe_die "Couldn't change owner of $1"         fi         if [ -n "$CELERYD_GROUP" ]; then             echo "- Changing group of '$1' to '$CELERYD_GROUP'"             chgrp "$CELERYD_GROUP" "$1"             maybe_die "Couldn't change group of $1"         fi     fi }   check_paths() {     if [ $CELERY_CREATE_LOGDIR -eq 1 ]; then         create_default_dir "$CELERYD_LOG_DIR"     fi     if [ $CELERY_CREATE_RUNDIR -eq 1 ]; then         create_default_dir "$CELERYD_PID_DIR"     fi }  create_paths() {     create_default_dir "$CELERYD_LOG_DIR"     create_default_dir "$CELERYD_PID_DIR" }  export PATH="${PATH:+$PATH:}/usr/sbin:/sbin"   _get_pid_files() {     [ ! -d "$CELERYD_PID_DIR" ] && return     echo `ls -1 "$CELERYD_PID_DIR"/*.pid 2> /dev/null` }  stop_workers () {     $CELERYD_MULTI stopwait $CELERYD_NODES --pidfile="$CELERYD_PID_FILE"     sleep $SLEEP_SECONDS }   start_workers () {     $CELERYD_MULTI start $CELERYD_NODES $DAEMON_OPTS        \                          --pidfile="$CELERYD_PID_FILE"      \                          --logfile="$CELERYD_LOG_FILE"      \                          --loglevel="$CELERYD_LOG_LEVEL"    \                          --cmd="$CELERYD"                   \                          $CELERYD_OPTS &     sleep $SLEEP_SECONDS }   restart_workers () {     $CELERYD_MULTI restart $CELERYD_NODES $DAEMON_OPTS      \                            --pidfile="$CELERYD_PID_FILE"    \                            --logfile="$CELERYD_LOG_FILE"    \                            --loglevel="$CELERYD_LOG_LEVEL"  \                            --cmd="$CELERYD"                 \                            $CELERYD_OPTS &     sleep $SLEEP_SECONDS }  check_status () {     local pid_files=     pid_files=`_get_pid_files`     [ -z "$pid_files" ] && echo "celeryd not running (no pidfile)" && exit 1      local one_failed=     for pid_file in $pid_files; do         local node=`basename "$pid_file" .pid`         local pid=`cat "$pid_file"`         local cleaned_pid=`echo "$pid" | sed -e 's/[^0-9]//g'`         if [ -z "$pid" ] || [ "$cleaned_pid" != "$pid" ]; then             echo "bad pid file ($pid_file)"         else             local failed=             kill -0 $pid 2> /dev/null || failed=true             if [ "$failed" ]; then                 echo "celeryd (node $node) (pid $pid) is stopped, but pid file exists!"                 one_failed=true             else                 echo "celeryd (node $node) (pid $pid) is running..."             fi         fi     done      [ "$one_failed" ] && exit 1 || exit 0 }   case "$1" in     start)         check_dev_null         check_paths         start_workers     ;;      stop)         check_dev_null         check_paths         stop_workers     ;;      reload|force-reload)         echo "Use restart"     ;;      status)         check_status     ;;      restart)         check_dev_null         check_paths         restart_workers     ;;     try-restart)         check_dev_null         check_paths         restart_workers     ;;     create-paths)         check_dev_null         create_paths     ;;     check-paths)         check_dev_null         check_paths     ;;     *)         echo "Usage: /etc/init.d/celeryd {start|stop|restart|kill|create-paths}"         exit 64  # EX_USAGE     ;; esac  exit 0 

My example /etc/default/celeryd for celery in virtual-env.

# 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"  ENV_MY="/home/stoyanov/wsapp" CELERYD="$ENV_MY/bin/celeryd" CELERYD_MULTI="$ENV_MY/bin/celeryd-multi" CELERYCTL="$ENV_MY/bin/celeryctl"  # Where to chdir at start. CELERYD_CHDIR="$ENV_MY/wslib/" ENV_PYTHON="$ENV_MY/bin/python" # Extra arguments to celeryd CELERYD_OPTS="--app=PriceProviders --loglevel=WARNING --events --autoreload" #"--time-limit=300 --concurrency=8"   # %n will be replaced with the nodename. CELERYD_LOG_FILE="/var/log/celery/%n.log" CELERYD_PID_FILE="/var/run/celery/%n.pid" CELERY_CREATE_RUNDIR=0 CELERY_CREATE_LOGDIR=0  # Workers should run as an unprivileged user. CELERYD_USER="stoyanov" #CELERYD_GROUP="stoyanov" 


文章来源: Celery in daemon mode
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!