263 lines
5.8 KiB
Bash
263 lines
5.8 KiB
Bash
#! /usr/bin/env bash
|
|
|
|
### BEGIN INIT INFO
|
|
# Provides: centrifugo
|
|
# Required-Start: $all
|
|
# Required-Stop: $remote_fs $syslog
|
|
# Default-Start: 2 3 4 5
|
|
# Default-Stop: 0 1 6
|
|
# Short-Description: Start centrifugo at boot time
|
|
### END INIT INFO
|
|
|
|
# Command-line options that can be set in /etc/default/centrifugo. These will override
|
|
# any config file values. Example: CENTRIFUGO_OPTS="--engine=redis"
|
|
DEFAULT=/etc/default/centrifugo
|
|
|
|
# Daemon options
|
|
CENTRIFUGO_OPTS=
|
|
|
|
# Process name
|
|
readonly NAME=centrifugo
|
|
|
|
# Absolute path to the printf executable.
|
|
readonly PRINT=/usr/bin/printf
|
|
|
|
# Absolute path to the which executable.
|
|
readonly WHICH=/usr/bin/which
|
|
|
|
# User and group
|
|
USER=centrifugo
|
|
GROUP=centrifugo
|
|
|
|
# Daemon name, where is the actual executable
|
|
# If the daemon is not there, then exit.
|
|
DAEMON=/usr/bin/centrifugo
|
|
[ -x $DAEMON ] || exit 5
|
|
|
|
# Configuration file
|
|
CONFIG=/etc/centrifugo/config.json
|
|
|
|
# PID file for the daemon
|
|
PIDFILE=/var/run/centrifugo/centrifugo.pid
|
|
PIDDIR=`dirname $PIDFILE`
|
|
if [ ! -d "$PIDDIR" ]; then
|
|
mkdir -p $PIDDIR
|
|
chown $USER:$GROUP $PIDDIR
|
|
fi
|
|
|
|
# Max open files
|
|
OPEN_FILE_LIMIT=65536
|
|
|
|
if [ -r /lib/lsb/init-functions ]; then
|
|
source /lib/lsb/init-functions
|
|
fi
|
|
|
|
readonly EC_INVALID_ARGUMENT=2
|
|
readonly EC_SUPER_USER_ONLY=4
|
|
readonly EC_DAEMON_NOT_FOUND=5
|
|
readonly EC_RELOADING_FAILED=95
|
|
readonly EC_RESTART_STOP_FAILED=96
|
|
readonly EC_RESTART_START_FAILED=97
|
|
readonly EC_START_FAILED=98
|
|
readonly EC_STOP_FAILED=99
|
|
|
|
# Logging
|
|
if [ -z "$STDOUT" ]; then
|
|
STDOUT=/var/log/centrifugo/centrifugo.log
|
|
fi
|
|
|
|
if [ ! -f "$STDOUT" ]; then
|
|
mkdir -p $(dirname $STDOUT)
|
|
fi
|
|
|
|
if [ -z "$STDERR" ]; then
|
|
STDERR=/var/log/centrifugo/centrifugo.log
|
|
fi
|
|
|
|
if [ ! -f "$STDERR" ]; then
|
|
mkdir -p $(dirname $STDERR)
|
|
fi
|
|
|
|
# Overwrite init script variables with /etc/default/centrifugo values
|
|
if [ -r $DEFAULT ]; then
|
|
source $DEFAULT
|
|
fi
|
|
|
|
# Exit the script with an error code.
|
|
die() {
|
|
log_end_msg $1
|
|
exit $1
|
|
}
|
|
|
|
# End the script.
|
|
end() {
|
|
log_end_msg 0
|
|
exit 0
|
|
}
|
|
|
|
# Display failure message.
|
|
fail() {
|
|
log_failure_msg "${NAME}" "$1"
|
|
}
|
|
|
|
# Display success message.
|
|
ok() {
|
|
log_success_msg "${NAME}" "$1"
|
|
}
|
|
|
|
# Reloads the service.
|
|
reload_service()
|
|
{
|
|
start-stop-daemon --stop --signal HUP --pidfile $PIDFILE
|
|
if [ $? -ne 0 ]; then
|
|
fail "failed to reload"
|
|
else
|
|
ok "reloaded"
|
|
fi
|
|
}
|
|
|
|
# Starts the service.
|
|
start_service()
|
|
{
|
|
# Check if config file exist
|
|
if [ ! -r $CONFIG ]; then
|
|
fail "config file doesn't exist (or you don't have permission to view)"
|
|
return 1
|
|
fi
|
|
# Bump the file limits, before launching the daemon. These will carry over to
|
|
# launched processes.
|
|
ulimit -n $OPEN_FILE_LIMIT
|
|
if [ $? -ne 0 ]; then
|
|
fail "set open file limit to $OPEN_FILE_LIMIT"
|
|
return 1
|
|
fi
|
|
start-stop-daemon --start --chuid $GROUP:$USER --quiet --background --make-pidfile --pidfile $PIDFILE --startas /bin/bash -- -c "exec $DAEMON -c $CONFIG $CENTRIFUGO_OPTS >> $STDOUT 2>&1"
|
|
if [ $? -ne 0 ]; then
|
|
fail "failed to start"
|
|
else
|
|
ok "started"
|
|
fi
|
|
}
|
|
|
|
# Stops the service.
|
|
stop_service() {
|
|
start-stop-daemon --stop --signal QUIT --retry=TERM/30/KILL/5 --pidfile $PIDFILE
|
|
if [ $? -ne 0 ]; then
|
|
fail "failed to stop"
|
|
else
|
|
ok "stopped"
|
|
fi
|
|
}
|
|
|
|
# Load the LSB log_* functions.
|
|
INCLUDE=/lib/lsb/init-functions
|
|
if [ -r "${INCLUDE}" ]
|
|
then
|
|
. "${INCLUDE}"
|
|
else
|
|
"${PRINT}" '%s: unable to load LSB functions, cannot start service.\n' "${NAME}" 1>&2
|
|
exit ${EC_DAEMON_NOT_FOUND}
|
|
fi
|
|
|
|
# Make sure only one argument was passed to the script.
|
|
if [ $# -ne 1 ]
|
|
then
|
|
if [ $# -lt 1 -o "$1" = '' ]
|
|
then fail 'action not specified.'
|
|
else fail 'too many arguments.'
|
|
fi
|
|
usage 1>&2
|
|
die ${EC_INVALID_ARGUMENT}
|
|
fi
|
|
readonly ACTION="$1"
|
|
|
|
# Check if daemon is a recognized program and get absolute path.
|
|
readonly DAEMON=$("${WHICH}" "${NAME}")
|
|
if [ ! -x "${DAEMON}" ]
|
|
then
|
|
if [ "${ACTION}" = 'stop' ]
|
|
then
|
|
fail 'executable not found: stop request ignored'
|
|
end
|
|
else
|
|
fail "executable not found: cannot ${ACTION} service"
|
|
die ${EC_DAEMON_NOT_FOUND}
|
|
fi
|
|
fi
|
|
|
|
# Check start-stop-daemon
|
|
readonly SSD=$("${WHICH}" "start-stop-daemon")
|
|
if [ ! -x "${SSD}" ]
|
|
then
|
|
fail "start-stop-daemon required"
|
|
end
|
|
fi
|
|
|
|
# Determine the service's status.
|
|
start-stop-daemon --status --pidfile "${PIDFILE}" 2>/dev/null 1>/dev/null
|
|
readonly STATUS=$?
|
|
|
|
configtest() {
|
|
$DAEMON checkconfig -c $CONFIG
|
|
}
|
|
|
|
status_q() {
|
|
status_of_proc "${DAEMON}" "${NAME}" >/dev/null 2>&1
|
|
}
|
|
|
|
case $1 in
|
|
start)
|
|
if [ ${STATUS} -eq 0 ]
|
|
then
|
|
ok 'already started.'
|
|
else
|
|
start_service || die ${EC_START_FAILED}
|
|
fi
|
|
;;
|
|
stop)
|
|
if [ ${STATUS} -eq 0 ]
|
|
then
|
|
stop_service || die ${EC_STOP_FAILED}
|
|
else
|
|
ok 'already stopped.'
|
|
fi
|
|
;;
|
|
restart)
|
|
if [ ${STATUS} -eq 0 ]
|
|
then
|
|
stop_service || die ${EC_RESTART_STOP_FAILED}
|
|
sleep 1
|
|
fi
|
|
start_service || die ${EC_RESTART_START_FAILED}
|
|
;;
|
|
configtest)
|
|
$1
|
|
;;
|
|
status)
|
|
status_of_proc "${DAEMON}" "${NAME}" || exit $?
|
|
;;
|
|
reload)
|
|
if [ ${STATUS} -eq 0 ]
|
|
then
|
|
configtest
|
|
if [[ $? -ne 0 ]]; then
|
|
die ${EC_RELOADING_FAILED}
|
|
fi
|
|
reload_service || die ${EC_RELOADING_FAILED}
|
|
else
|
|
fail 'service not running, nothing to be done.'
|
|
fi
|
|
;;
|
|
version)
|
|
$DAEMON version
|
|
;;
|
|
condrestart)
|
|
status_q && $0 restart || exit 0
|
|
;;
|
|
*)
|
|
# For invalid arguments, print the usage message.
|
|
echo "Usage: $0 {start|stop|restart|condrestart|reload|configtest|status|version}"
|
|
exit 2
|
|
;;
|
|
esac
|