Browse Source

contrib/debian/init.d/celeryd-multi: init script using celeryd-multi

Ask Solem 15 years ago
parent
commit
3ca24b183c
2 changed files with 225 additions and 11 deletions
  1. 42 11
      celery/bin/celeryd_multi.py
  2. 183 0
      contrib/debian/init.d/celeryd-multi

+ 42 - 11
celery/bin/celeryd_multi.py

@@ -73,8 +73,8 @@ def format_opt(opt, value):
     if not value:
     if not value:
         return opt
         return opt
     if opt[0:2] == "--":
     if opt[0:2] == "--":
-        return "%s=%s" % (opt, quote(value))
-    return "%s %s" % (opt, quote(value))
+        return "%s=%s" % (opt, value)
+    return "%s %s" % (opt, value)
 
 
 
 
 def parse_ns_range(ns, ranges=False):
 def parse_ns_range(ns, ranges=False):
@@ -89,6 +89,17 @@ def parse_ns_range(ns, ranges=False):
     return ret
     return ret
 
 
 
 
+def abbreviations(map):
+
+    def expand(S):
+        ret = S
+        for short, long in map.items():
+            ret = ret.replace(short, long)
+        return ret
+
+    return expand
+
+
 def multi_args(p, cmd="celeryd", prefix="", suffix=""):
 def multi_args(p, cmd="celeryd", prefix="", suffix=""):
     names = p.values
     names = p.values
     options = dict(p.options)
     options = dict(p.options)
@@ -108,29 +119,49 @@ def multi_args(p, cmd="celeryd", prefix="", suffix=""):
                 p.namespaces[subns].update(ns_opts)
                 p.namespaces[subns].update(ns_opts)
         p.namespaces.pop(ns_name)
         p.namespaces.pop(ns_name)
 
 
-    cels = []
     for name in names:
     for name in names:
         this_name = options["-n"] = prefix + name + suffix
         this_name = options["-n"] = prefix + name + suffix
-        this_cmd = cmd.replace("%n", this_name)
-        line = this_cmd + " " + " ".join(format_opt(opt, value)
-                for opt, value in p.optmerge(name, options).items())
-        cels.append((this_name, line))
+        expand = abbreviations({"%n": this_name,
+                                "%p": prefix + name})
+        line = expand(cmd) + " " + " ".join(
+                format_opt(opt, expand(value))
+                    for opt, value in p.optmerge(name, options).items())
+        yield this_name, line, expand
+
 
 
-    return cels
 
 
 
 
 def names(argv, cmd):
 def names(argv, cmd):
     p = NamespacedOptionParser(argv)
     p = NamespacedOptionParser(argv)
     print("\n".join(hostname
     print("\n".join(hostname
-                        for hostname, _ in multi_args(p, cmd)))
+                        for hostname, _, _ in multi_args(p, cmd)))
+
+def get(argv, cmd):
+    wanted = argv[0]
+    p = NamespacedOptionParser(argv[1:])
+    for name, worker, _ in multi_args(p, cmd):
+        if name == wanted:
+            print(worker)
+            return
+
 
 
 def start(argv, cmd):
 def start(argv, cmd):
     p = NamespacedOptionParser(argv)
     p = NamespacedOptionParser(argv)
     print("\n".join(worker
     print("\n".join(worker
-                        for _, worker in multi_args(p, cmd)))
+                        for _, worker, _ in multi_args(p, cmd)))
+
+def expand(argv, cmd=None):
+    template = argv[0]
+    p = NamespacedOptionParser(argv[1:])
+    for _, _, expander in multi_args(p, cmd):
+        print(expander(template))
+
 
 
 
 
-COMMANDS = {"start": start, "names": names}
+COMMANDS = {"start": start,
+            "names": names,
+            "expand": expand,
+            "get": get}
 
 
 
 
 def celeryd_multi(argv, cmd="celeryd"):
 def celeryd_multi(argv, cmd="celeryd"):

+ 183 - 0
contrib/debian/init.d/celeryd-multi

@@ -0,0 +1,183 @@
+#!/bin/bash
+
+### BEGIN INIT INFO
+# Provides:		celeryd
+# Required-Start:	
+# Required-Stop:	
+# Default-Start:	2 3 4 5
+# Default-Stop:		1
+# Short-Description:	celery task worker daemon
+### END INIT INFO
+
+# OS X Debug replacements to lsb-functions.
+#log_action_msg () {
+#    echo $*
+#}
+#log_daemon_msg () {
+#    echo $*
+#}
+#log_end_msg () {
+#    if [ $1 -eq 0 ]; then
+#        echo "ok"
+#    else
+#        echo "failed!"
+#    fi
+#}
+
+set -e
+
+CELERYD_PID_FILE="/var/run/celeryd-%p.pid"
+CELERYD_LOG_FILE="/var/log/celeryd-%p.log"
+CELERYD_LOG_LEVEL="INFO"
+CELERYD_NUM_WORKERS=2
+DEFAULT_CELERYD="celeryd"
+
+# /etc/init.d/ssh: start and stop the celery task worker daemon.
+
+if test -f /etc/default/celeryd; then
+    . /etc/default/celeryd
+fi
+
+export CELERY_LOADER
+
+. /lib/lsb/init-functions
+
+CELERYD_OPTS="$CELERYD_OPTS -f $CELERYD_LOG_FILE -l $CELERYD_LOG_LEVEL"
+
+if [ -n "$2" ]; then
+    CELERYD_OPTS="$CELERYD_OPTS $2"
+fi
+
+# Extra start-stop-daemon options, like user/group.
+if [ -n "$CELERYD_USER" ]; then
+    DAEMON_OPTS="$DAEMON_OPTS --chuid $CELERYD_USER"
+fi
+if [ -n "$CELERYD_GROUP" ]; then
+    DAEMON_OPTS="$DAEMON_OPTS --group $CELERYD_GROUP"
+fi
+
+
+# Are we running from init?
+run_by_init() {
+    ([ "$previous" ] && [ "$runlevel" ]) || [ "$runlevel" = S ]
+}
+
+
+check_dev_null() {
+    if [ ! -c /dev/null ]; then
+	if [ "$1" = log_end_msg ]; then
+	    log_end_msg 1 || true
+	fi
+	if ! run_by_init; then
+	    log_action_msg "/dev/null is not a character device!"
+	fi
+	exit 1
+    fi
+}
+
+
+export PATH="${PATH:+$PATH:}/usr/sbin:/sbin"
+if [ ! -z "$VIRTUALENV" ]; then
+    export PATH="$VIRTUALENV/bin:$PATH"
+    CELERYD="$VIRTUALENV/bin/$CELERYD"
+fi
+
+
+if [ -f "$CELERYD" -a ! -x "$CELERYD" ]; then
+    echo "ERROR: $CELERYD is not executable."
+    echo "Please make it executable by doing: chmod +x '$CELERYD'"
+
+    echo "celeryd is disabled"
+    exit
+fi
+
+WORKERS=$CELERYD_NUM_WORKERS
+
+stop_worker () {
+    cmd="start-stop-daemon  --stop --quiet $* --pidfile $CELERYD_PID_FILE"
+    w=`celeryd-multi start $WORKERS --cmd="start-stop-daemon --stop \
+                                        --quiet $* \
+                                        --pidfile $CELERYD_PID_FILE"`
+    for wname in `celeryd-multi names $WORKERS $CELERYD_OPTS`; do
+        log_daemon_msg "Stopping celery task worker" "$wname"
+        stopcmd=`celeryd-multi get "$wname" $WORKERS --cmd="$cmd" $CELERYD_OPTS`
+        if `$stopcmd`; then
+            log_end_msg 0
+        else:
+            log_end_msg 1
+        fi
+    done
+}
+
+start_worker () {
+    check_dev_null
+    cmd="start-stop-daemon --start $DAEMON_OPTS \
+                                    --quiet --oknodo --background \
+                                    --make-pidfile $* \
+                                    --pidfile $CELERYD_PID_FILE \
+                                    --exec $CELERYD --"
+    for wname in `celeryd-multi names $WORKERS $CELERYD_OPTS`; do
+        log_daemon_msg "Starting celery task worker" "$wname"
+        startcmd=`celeryd-multi get "$wname" $WORKERS --cmd="$cmd" $CELERYD_OPTS`
+        if `$startcmd`; then
+            log_end_msg 0
+        else
+            log_end_msg 1
+        fi
+    done
+}
+
+case "$1" in
+  start)
+    start_worker
+    ;;
+  stop)
+    stop_worker --oknodo
+    ;;
+
+  reload|force-reload)
+    echo "Use start+stop"
+    ;;
+
+  restart)
+    stop_worker --retry 30 --oknodo
+    start_worker
+    ;;
+
+  try-restart)
+    log_daemon_msg "Restarting celery task worker server" "celeryd"
+    set +e
+    stop_worker --retry 30
+    RET="$?"
+    set -e
+    case $RET in
+        0)
+		# old daemon stopped
+		check_dev_null log_end_msg
+        start_worker
+		;;
+	    1)
+		# daemon not running
+		log_progress_msg "(not running)"
+		log_end_msg 0
+		;;
+	    *)
+		# failed to stop
+		log_progress_msg "(failed to stop)"
+		log_end_msg 1
+		;;
+	esac
+	;;
+
+  status)
+    pidfiles=`celeryd-multi expand "$CELERYD_PID_FILE" $WORKERS $DAEMON_OPTS`
+    for pidfile in $pidfiles; do
+        status_of_proc -p $pidfile $CELERYD celeryd && exit 0 || exit $?
+    done
+	;;
+  *)
+	log_action_msg "Usage: /etc/init.d/celeryd-multi {start|stop|force-reload|restart|try-restart|status}"
+	exit 1
+esac
+
+exit 0