Celeryd 및 Celerybeat를 데몬으로 설정했으며 너무 길지 않을 때까지 작업했습니다. 그러나 얼마 후에는 직원을 고용하지 않고 pid 파일을 만들지 않을 것입니다.celeryd 및 celerybeat pid 파일이 작성되지 않고 작업자가 시작하지 않지만 출력에 OK라고 표시됩니다.
# Name of nodes to start
CELERYD_NODES="w1 w2 w3 w4 w5 w6 w7 w8"
# Extra arguments to celeryd
CELERYD_OPTS="--time-limit=300 --concurrency=8"
# Where to chdir at start.
CELERYD_CHDIR="/srv/www/web-system/myproject"
# %n will be replaced with the nodename.
#CELERYD_LOG_FILE="/var/log/celery/%n.log"
#CELERYD_PID_FILE="/var/run/celery/%n.pid"
CELERYD_LOG_FILE="/srv/www/web-system/logs/celery/%n.log"
CELERYD_PID_FILE="/srv/www/web-system/pids/celery/%n.pid"
# Log level to use for celeryd. Default is INFO.
CELERYD_LOG_LEVEL="INFO"
# How to call "manage.py celeryd_multi"
CELERYD_MULTI="$CELERYD_CHDIR/manage.py celeryd_multi"
# How to call "manage.py celeryctl"
CELERYCTL="$CELERYD_CHDIR/manage.py celeryctl"
# Workers should run as an unprivileged user.
#CELERYD_USER="celery"
#CELERYD_GROUP="celery"
CELERYD_USER="myuser"
CELERYD_GROUP="myuser"
# Name of the projects settings module.
export DJANGO_SETTINGS_MODULE="myproject.settings"
여기에 init.d
스크립트입니다 : 여기
/etc/default/celeryd
입니다
the documentation에 제안,
sh -x /etc/init.d/celeryd start
, 이것을 : 또한
#!/bin/sh -e
# ============================================
# 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
### 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
# 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:-0}
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.
if [ -n "$CELERYD_USER" ]; then
DAEMON_OPTS="$DAEMON_OPTS --uid=$CELERYD_USER"
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
, 나는 다음과 같은 명령을 사용하여 초기화 스크립트를 실행 출력은 다음과 같습니다.
# sh -x /etc/init.d/celeryd start
+ 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=/etc/default/celeryd
+ test -f /etc/default/celeryd
+ . /etc/default/celeryd
+ CELERYD_NODES=w1 w2 w3 w4 w5 w6 w7 w8
+ CELERYD_OPTS=--time-limit=300 --concurrency=8
+ CELERYD_CHDIR=/srv/www/web-system/myproject
+ CELERYD_LOG_FILE=/srv/www/web-system/logs/celery/%n.log
+ CELERYD_PID_FILE=/srv/www/web-system/pids/celery/%n.pid
+ CELERYD_LOG_LEVEL=INFO
+ CELERYD_MULTI=/srv/www/web-system/myproject/manage.py celeryd_multi
+ CELERYCTL=/srv/www/web-system/myproject/manage.py celeryctl
+ CELERYD_USER=myproject
+ CELERYD_GROUP=myproject
+ export DJANGO_SETTINGS_MODULE=myproject.settings
+ CELERY_CREATE_DIRS=0
+ CELERY_CREATE_RUNDIR=0
+ CELERY_CREATE_LOGDIR=0
+ [ -z /srv/www/sistema-web/pids/celery/%n.pid ]
+ [ -z /srv/www/sistema-web/logs/celery/%n.log ]
+ CELERYD_LOG_LEVEL=INFO
+ CELERYD_MULTI=/srv/www/web-system/myproject/manage.py celeryd_multi
+ CELERYD=-m celery.bin.celeryd_detach
+ CELERYD_NODES=w1 w2 w3 w4 w5 w6 w7 w8
+ export CELERY_LOADER
+ [ -n ]
+ dirname /srv/www/web-system/logs/celery/%n.log
+ CELERYD_LOG_DIR=/srv/www/web-system/logs/celery
+ dirname /srv/www/web-system/pids/celery/%n.pid
+ CELERYD_PID_DIR=/srv/www/web-system/pids/celery
+ [ -n yougrups ]
+ DAEMON_OPTS= --uid=myprojects
+ [ -n yougrups ]
+ DAEMON_OPTS= --uid=myprojects --gid=myprojects
+ [ -n /srv/www/web-system/myprojects ]
+ DAEMON_OPTS= --uid=myproject --gid=myproject --workdir=/srv/www/web-system/myproject
+ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/sbin:/sbin
+ check_dev_null
+ [ ! -c /dev/null ]
+ check_paths
+ [ 0 -eq 1 ]
+ [ 0 -eq 1 ]
+ start_workers
+ /srv/www/web-system/myproject/manage.py celeryd_multi start w1 w2 w3 w4 w5 w6 w7 w8 --uid=myproject --gid=myproject --workdir=/srv/www/web-system/myproject --pidfile=/srv/www/web-system/pids/celery/%n.pid --logfile=/srv/www/web-system/logs/celery/%n.log --loglevel=INFO --cmd=-m celery.bin.celeryd_detach --time-limit=300 --concurrency=8
celeryd-multi v3.0.21 (Chiastic Slide)
> Starting nodes...
> w1.myproject: OK
> w2.myproject: OK
> w3.myproject: OK
> w4.myproject: OK
> w5.myproject: OK
> w6.myproject: OK
> w7.myproject: OK
> w8.myproject: OK
+ sleep 5
+ exit 0
그런 다음 pids dir을 확인하면 비어 있으며 ps aux
에 대한 활성 프로세스가 없다고 표시됩니다. 로그에는 아무것도 없습니다. 나는 virtualenv를 사용하지 않는다. 그냥 일하는 것을 멈췄습니다. django-celery
의 버전은 3.0.21
입니다.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys
path = '/srv/www/web-system/'
if path not in sys.path:
sys.path.append(path)
sys.path.append(path + 'myproject/')
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
import djcelery
djcelery.setup_loader()
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
을 그리고 이것은 내 djcelery 관련 설정입니다 : 여기 내 wsgi
스크립트입니다
# For Celery & RabbitMQ:
# Create user and vhost for RabbitMQ with the following commands:
#
# $ sudo rabbitmqctl add_user myproject <mypassword>
# $ sudo rabbitmqctl add_vhost myproject
# $ sudo rabbitmqctl set_permissions -p myproject myproject ".*" ".*" ".*"
# Format: amqp://user:[email protected]:port/vhost
BROKER_URL = 'amqp://myproject:[email protected]:5672/myproject'
import djcelery
djcelery.setup_loader()
이 어떤 제안 정말 감사하겠습니다하십시오 !!!! 미리 감사드립니다 ...
혹시이 문제를 해결 했습니까? – wdh
@wdh : 예! 나는 그것을 풀었지만 정확하게 무슨 일이 일어 났는지 기억하지 못한다. 셀러 리가 실행 한 코드에 오류가있었습니다 (내 정기적 인 작업에 있다고 생각합니다). 그리고 어떤 이유로 셀러리가 추락했습니다. 나는 모든 셀러리 관련 코드 hahahaha에 깃발 (지문)을 넣어 충돌이 일어날 때까지 발견했습니다. 나는 셀러리에 의해 잡히지 않는 예외가 있다고 생각하고 셀러리를 멈추게한다. 그러나 다시, 나는 반복한다, 나는 정확히 무슨 일이 있었는지 기억하지 못한다. 이 오래된 전문가가 아닌 디버깅 기술이 도움이되기를 바랍니다. – Throoze
감사합니다. 정말 유용합니다! – wdh