浏览代码

Merge branch 'mpavlov/pid-based-status-check' into 3.0

Ask Solem 12 年之前
父节点
当前提交
a1854da73d
共有 1 个文件被更改,包括 35 次插入8 次删除
  1. 35 8
      extra/generic-init.d/celeryd

+ 35 - 8
extra/generic-init.d/celeryd

@@ -18,7 +18,8 @@
 # Short-Description: celery task worker daemon
 ### END INIT INFO
 
-#set -e
+# 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"
@@ -26,14 +27,9 @@ DEFAULT_LOG_LEVEL="INFO"
 DEFAULT_NODES="celery"
 DEFAULT_CELERYD="-m celery.bin.celeryd_detach"
 
-# /etc/init.d/celeryd: start and stop the celery task worker daemon.
-
 CELERY_DEFAULTS=${CELERY_DEFAULTS:-"/etc/default/celeryd"}
 
 test -f "$CELERY_DEFAULTS" && . "$CELERY_DEFAULTS"
-if [ -f "/etc/default/celeryd" ]; then
-    . /etc/default/celeryd
-fi
 
 # Set CELERY_CREATE_DIRS to always create log/pid dirs.
 CELERY_CREATE_DIRS=${CELERY_CREATE_DIRS:-0}
@@ -51,7 +47,6 @@ fi
 CELERYD_LOG_LEVEL=${CELERYD_LOG_LEVEL:-${CELERYD_LOGLEVEL:-$DEFAULT_LOG_LEVEL}}
 CELERYD_MULTI=${CELERYD_MULTI:-"celeryd-multi"}
 CELERYD=${CELERYD:-$DEFAULT_CELERYD}
-CELERYCTL=${CELERYCTL:="celeryctl"}
 CELERYD_NODES=${CELERYD_NODES:-$DEFAULT_NODES}
 
 export CELERY_LOADER
@@ -130,8 +125,14 @@ create_paths() {
 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
 }
 
 
@@ -142,6 +143,7 @@ start_workers () {
                          --loglevel="$CELERYD_LOG_LEVEL"    \
                          --cmd="$CELERYD"                   \
                          $CELERYD_OPTS
+    sleep $SLEEP_SECONDS
 }
 
 
@@ -152,8 +154,33 @@ restart_workers () {
                            --loglevel="$CELERYD_LOG_LEVEL"  \
                            --cmd="$CELERYD"                 \
                            $CELERYD_OPTS
+    sleep $SLEEP_SECONDS
 }
 
+check_status () {
+    local pid_files=`_get_pid_files`
+    [ -z "$pid_files" ] && echo "celeryd is stopped" && exit 1
+
+    local one_failed=
+    for pid_file in $pid_files; do
+        local node=`basename "$pid_file" .pid`
+        local pid=`cat "$pid_file"`
+        if [ -z "$pid" ] || [ "${pid//[0-9]/}" ]; 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
@@ -174,7 +201,7 @@ case "$1" in
     ;;
 
     status)
-        $CELERYCTL status $CELERYCTL_OPTS
+        check_status
     ;;
 
     restart)