Browse Source

Added centos celerybeat init script + sysconfig example + simple tests

ffeast 11 years ago
parent
commit
c67fae736e

+ 239 - 0
extra/centos/celerybeat

@@ -0,0 +1,239 @@
+#!/bin/sh
+# ============================================
+#  celerybeat - Starts the Celery periodic task scheduler.
+# ============================================
+#
+# :Usage: /etc/init.d/celerybeat {start|stop|restart|status}
+# :Configuration file: /etc/sysconfig/celerybeat
+#
+# See http://docs.celeryproject.org/en/latest/tutorials/daemonizing.html
+
+### BEGIN INIT INFO
+# Provides:          celerybeat
+# 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
+#
+#
+# To implement separate init scripts, do NOT copy this script.  Instead,
+# symlink it.  I.e., if my new application, "little-worker" needs an init, I
+# should just use:
+#
+#   ln -s /etc/init.d/celerybeat /etc/init.d/little-worker
+#
+# You can then configure this by manipulating /etc/sysconfig/little-worker.
+#
+# Setting `prog` here allows you to symlink this init script, making it easy
+# to run multiple processes on the system.
+
+# If we're invoked via SysV-style runlevel scripts we need to follow the 
+# link from rcX.d before working out the script name.
+if [[ `dirname $0` == /etc/rc*.d ]]; then
+    target="$(readlink $0)"
+else
+    target=$0
+fi
+
+prog="$(basename $target)"
+
+# Source the centos service helper functions
+source /etc/init.d/functions
+# NOTE: "set -e" does not work with the above functions,
+# which use non-zero return codes as non-error return conditions
+
+# some commands work asyncronously, so we'll wait this many seconds
+SLEEP_SECONDS=5
+
+DEFAULT_PID_FILE="/var/run/celery/$prog.pid"
+DEFAULT_LOG_FILE="/var/log/celery/$prog.log"
+DEFAULT_LOG_LEVEL="INFO"
+DEFAULT_NODES="celery"
+
+CELERY_DEFAULTS=${CELERY_DEFAULTS:-"/etc/sysconfig/$prog"}
+
+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 "$CELERYBEAT_PID_FILE" ]; then
+    CELERYBEAT_PID_FILE="$DEFAULT_PID_FILE"
+    CELERY_CREATE_RUNDIR=1
+fi
+if [ -z "$CELERYBEAT_LOG_FILE" ]; then
+    CELERYBEAT_LOG_FILE="$DEFAULT_LOG_FILE"
+    CELERY_CREATE_LOGDIR=1
+fi
+
+CELERYBEAT_LOG_LEVEL=${CELERYBEAT_LOG_LEVEL:-${CELERYBEAT_LOGLEVEL:-$DEFAULT_LOG_LEVEL}}
+CELERYBEAT=${CELERYBEAT:-"${CELERY_BIN} beat"}
+CELERYBEAT=${CELERYBEAT:-$DEFAULT_CELERYBEAT}
+CELERYBEAT_NODES=${CELERYBEAT_NODES:-$DEFAULT_NODES}
+
+# This is used to change how Celery loads in the configs.  It does not need to
+# be set to be run.
+export CELERY_LOADER
+
+if [ -n "$2" ]; then
+    CELERYBEAT_OPTS="$CELERYBEAT_OPTS $2"
+fi
+
+CELERYBEAT_OPTS=${CELERYBEAT_OPTS:-"--app=$CELERY_APP"}
+CELERYBEAT_LOG_DIR=`dirname $CELERYBEAT_LOG_FILE`
+CELERYBEAT_PID_DIR=`dirname $CELERYBEAT_PID_FILE`
+
+# Extra start-stop-daemon options, like user/group.
+if [ -n "$CELERYBEAT_USER" ]; then
+    DAEMON_OPTS="$DAEMON_OPTS --uid=$CELERYBEAT_USER"
+fi
+if [ -n "$CELERYBEAT_GROUP" ]; then
+    DAEMON_OPTS="$DAEMON_OPTS --gid=$CELERYBEAT_GROUP"
+fi
+
+if [ -n "$CELERYBEAT_CHDIR" ]; then
+    DAEMON_OPTS="$DAEMON_OPTS --workdir=$CELERYBEAT_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 "$CELERYBEAT_USER" ]; then
+            echo "- Changing owner of '$1' to '$CELERYBEAT_USER'"
+            chown "$CELERYBEAT_USER" "$1"
+            maybe_die "Couldn't change owner of $1"
+        fi
+        if [ -n "$CELERYBEAT_GROUP" ]; then
+            echo "- Changing group of '$1' to '$CELERYBEAT_GROUP'"
+            chgrp "$CELERYBEAT_GROUP" "$1"
+            maybe_die "Couldn't change group of $1"
+        fi
+    fi
+}
+
+
+check_paths() {
+    if [ $CELERY_CREATE_LOGDIR -eq 1 ]; then
+        create_default_dir "$CELERYBEAT_LOG_DIR"
+    fi
+    if [ $CELERY_CREATE_RUNDIR -eq 1 ]; then
+        create_default_dir "$CELERYBEAT_PID_DIR"
+    fi
+}
+
+create_paths() {
+    create_default_dir "$CELERYBEAT_LOG_DIR"
+    create_default_dir "$CELERYBEAT_PID_DIR"
+}
+
+export PATH="${PATH:+$PATH:}/usr/sbin:/sbin"
+
+stop() {
+    [[ ! -f "$CELERYBEAT_PID_FILE" ]] && echo "$prog is stopped" && return 0
+ 
+    local one_failed=
+    echo -n $"Stopping $prog: "
+
+    # killproc comes from 'functions' and brings three nice features:
+    #  1. sending TERM, sleeping, then sleeping more if needed, then sending KILL
+    #  2. handling 'success' and 'failure' output
+    #  3. removes stale pid files, if any remain
+    killproc -p "$CELERYBEAT_PID_FILE" -d "$SLEEP_SECONDS" $prog || one_failed=true
+    echo
+
+    [[ "$one_failed" ]] && return 1 || return 0
+}
+
+start() {
+    echo -n $"Starting $prog: "
+
+    # If Celery is already running, bail out
+    if [[ -f "$CELERYBEAT_PID_FILE" ]]; then
+        echo -n "$prog is already running. Use 'restart'."
+        failure
+        echo
+        return 1
+    fi
+
+    $CELERYBEAT $CELERYBEAT_OPTS $DAEMON_OPTS --detach         \
+                         --pidfile="$CELERYBEAT_PID_FILE"      \
+                         --logfile="$CELERYBEAT_LOG_FILE"      \
+                         --loglevel="$CELERYBEAT_LOG_LEVEL"
+
+    if [[ "$?" == "0" ]]; then
+        # Sleep a few seconds to give Celery a chance to initialize itself.
+        # This is useful to prevent scripts following this one from trying to
+        # use Celery (or its pid files) too early.
+        sleep $SLEEP_SECONDS
+        if [[ -f "$CELERYBEAT_PID_FILE" ]]; then
+            success
+            echo
+            return 0
+        else  # celerybeat succeeded but no pid files found
+            failure
+        fi
+    else  # celerybeat did not succeed
+        failure
+    fi
+    echo
+    return 1
+}
+
+check_status() {
+    status -p "$CELERYBEAT_PID_FILE" $"$prog" || return 1
+    return 0
+}
+
+case "$1" in
+    start)
+        check_dev_null
+        check_paths
+        start
+    ;;
+
+    stop)
+        check_dev_null
+        check_paths
+        stop
+    ;;
+
+    status)
+        check_status
+    ;;
+
+    restart)
+        check_dev_null
+        check_paths
+        stop && start
+    ;;
+
+    *)
+        echo "Usage: /etc/init.d/$prog {start|stop|restart|status}"
+        exit 3
+    ;;
+esac
+
+exit $?

+ 15 - 0
extra/centos/celerybeat.sysconfig

@@ -0,0 +1,15 @@
+# In CentOS, contents should be placed in the file /etc/sysconfig/celeryd
+# Available options: http://celery.readthedocs.org/en/latest/tutorials/daemonizing.html#init-script-celerybeat
+
+# Where the Django project is.
+#CELERYBEAT_CHDIR="/path/to/my_application"
+
+# Absolute or relative path to the celery program
+#CELERY_BIN="/usr/local/bin/celery"
+
+# App instance to use (value for --app argument).
+#CELERY_APP="my_application.path.to.worker"
+
+# Beat run as an unprivileged user
+#CELERYBEAT_USER="brandings"
+#CELERYBEAT_GROUP="brandings"

+ 6 - 0
extra/centos/test_celerybeat.sh

@@ -0,0 +1,6 @@
+#!/bin/sh
+
+# If you make changes to the celerybeat init script,
+# you can use this test script to verify you didn't break the universe
+
+./test_service.sh celerybeat

+ 1 - 36
extra/centos/test_celeryd.sh

@@ -3,39 +3,4 @@
 # If you make changes to the celeryd init script,
 # you can use this test script to verify you didn't break the universe
 
-SERVICE="celeryd"
-SERVICE_CMD="sudo /sbin/service $SERVICE"
-
-run_test() {
-    local msg="$1"
-    local cmd="$2"
-    local expected_retval="${3:-0}"
-    local n=${#msg}
-
-    echo
-    echo `printf "%$((${n}+4))s" | tr " " "#"`
-    echo "# $msg #"
-    echo `printf "%$((${n}+4))s" | tr " " "#"`
-
-    $cmd
-    local retval=$?
-    if [[ "$retval" == "$expected_retval" ]]; then
-        echo "[PASSED]"
-    else
-        echo "[FAILED]"
-        echo "Exit status: $retval, but expected: $expected_retval"
-        exit $retval
-    fi
-}
-
-run_test "stop should succeed" "$SERVICE_CMD stop" 0
-run_test "status on a stopped service should return 1" "$SERVICE_CMD status" 1
-run_test "stopping a stopped celery should not fail" "$SERVICE_CMD stop" 0
-run_test "start should succeed" "$SERVICE_CMD start" 0
-run_test "status on a running service should return 0" "$SERVICE_CMD status" 0
-run_test "starting a running service should fail" "$SERVICE_CMD start" 1
-run_test "restarting a running service should succeed" "$SERVICE_CMD restart" 0
-run_test "status on a restarted service should return 0" "$SERVICE_CMD status" 0
-run_test "stop should succeed" "$SERVICE_CMD stop" 0
-
-echo "All tests passed!"
+./test_service.sh celeryd

+ 43 - 0
extra/centos/test_service.sh

@@ -0,0 +1,43 @@
+#!/bin/sh
+
+if [ -z "$1" ]; then
+    echo 'service name is not specified'
+    exit -1
+fi
+
+SERVICE="$1"
+SERVICE_CMD="sudo /sbin/service $SERVICE"
+
+run_test() {
+    local msg="$1"
+    local cmd="$2"
+    local expected_retval="${3:-0}"
+    local n=${#msg}
+
+    echo
+    echo `printf "%$((${n}+4))s" | tr " " "#"`
+    echo "# $msg #"
+    echo `printf "%$((${n}+4))s" | tr " " "#"`
+
+    $cmd
+    local retval=$?
+    if [[ "$retval" == "$expected_retval" ]]; then
+        echo "[PASSED]"
+    else
+        echo "[FAILED]"
+        echo "Exit status: $retval, but expected: $expected_retval"
+        exit $retval
+    fi
+}
+
+run_test "stop should succeed" "$SERVICE_CMD stop" 0
+run_test "status on a stopped service should return 1" "$SERVICE_CMD status" 1
+run_test "stopping a stopped celery should not fail" "$SERVICE_CMD stop" 0
+run_test "start should succeed" "$SERVICE_CMD start" 0
+run_test "status on a running service should return 0" "$SERVICE_CMD status" 0
+run_test "starting a running service should fail" "$SERVICE_CMD start" 1
+run_test "restarting a running service should succeed" "$SERVICE_CMD restart" 0
+run_test "status on a restarted service should return 0" "$SERVICE_CMD status" 0
+run_test "stop should succeed" "$SERVICE_CMD stop" 0
+
+echo "All tests passed!"