forked from NAL-i5K/genomics-workspace
-
Notifications
You must be signed in to change notification settings - Fork 0
/
celeryd
executable file
·266 lines (225 loc) · 7.29 KB
/
celeryd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
#!/bin/sh
# ============================================
# celeryd - Starts the Celery worker daemon.
# ============================================
#
# :Usage: /etc/init.d/celeryd {start|stop|restart|status}
# :Configuration file: /etc/sysconfig/celeryd
#
# See http://docs.celeryproject.org/en/latest/tutorials/daemonizing.html
### 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
#
#
# 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/celeryd /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-%n.pid"
DEFAULT_LOG_FILE="/var/log/celery/$prog-%n.log"
DEFAULT_LOG_LEVEL="INFO"
DEFAULT_NODES="celery"
DEFAULT_CELERYD="-m celery.bin.celeryd_detach"
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 "$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}
# 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
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"/$prog-*.pid 2> /dev/null)
}
stop() {
local pid_files=$(_get_pid_files)
[[ -z "$pid_files" ]] && echo "$prog is stopped" && return 0
local one_failed=
for pid_file in $pid_files; do
local pid=$(cat "$pid_file")
echo -n $"Stopping $prog (pid $pid): "
# 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 "$pid_file" -d "$SLEEP_SECONDS" $prog || one_failed=true
echo
done
[[ "$one_failed" ]] && return 1 || return 0
}
start() {
echo -n $"Starting $prog: "
# If Celery is already running, bail out
local pid_files=$(_get_pid_files)
if [[ "$pid_files" ]]; then
echo -n $"$prog is already running. Use 'restart'."
failure
echo
return 1
fi
$CELERYD_MULTI start $CELERYD_NODES $DAEMON_OPTS \
--pidfile="$CELERYD_PID_FILE" \
--logfile="$CELERYD_LOG_FILE" \
--loglevel="$CELERYD_LOG_LEVEL" \
--cmd="$CELERYD" \
--quiet \
$CELERYD_OPTS
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
pid_files=$(_get_pid_files)
if [[ "$pid_files" ]]; then
for pid_file in $pid_files; do
local node=$(basename "$pid_file" .pid)
local pid=$(cat "$pid_file")
echo
echo -n " $node (pid $pid):"
success
done
echo
return 0
else # celeryd_multi succeeded but no pid files found
failure
fi
else # celeryd_multi did not succeed
failure
fi
echo
return 1
}
check_status() {
local pid_files=$(_get_pid_files)
[[ -z "$pid_files" ]] && echo "$prog is stopped" && return 1
for pid_file in $pid_files; do
local node=$(basename "$pid_file" .pid)
status -p "$pid_file" $"$prog (node $node)" || return 1 # if one node is down celeryd is down
done
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 $?