mirror of
https://github.com/elastic/logstash.git
synced 2025-04-24 14:47:19 -04:00
205 lines
4.6 KiB
Bash
Executable file
205 lines
4.6 KiB
Bash
Executable file
#!/bin/sh
|
|
# Init script for logstash
|
|
# Maintained by Elasticsearch
|
|
# Generated by pleaserun.
|
|
# Implemented based on LSB Core 3.1:
|
|
# * Sections: 20.2, 20.3
|
|
#
|
|
### BEGIN INIT INFO
|
|
# Provides: logstash
|
|
# Required-Start: $remote_fs $syslog
|
|
# Required-Stop: $remote_fs $syslog
|
|
# Default-Start: 2 3 4 5
|
|
# Default-Stop: 0 1 6
|
|
# Short-Description:
|
|
# Description: Starts Logstash as a daemon.
|
|
### END INIT INFO
|
|
|
|
PATH=/sbin:/usr/sbin:/bin:/usr/bin
|
|
export PATH
|
|
|
|
if [ `id -u` -ne 0 ]; then
|
|
echo "You need root privileges to run this script"
|
|
exit 1
|
|
fi
|
|
|
|
name=logstash
|
|
pidfile="/var/run/$name.pid"
|
|
|
|
LS_USER=logstash
|
|
LS_GROUP=logstash
|
|
LS_HOME=/var/lib/logstash
|
|
LS_HEAP_SIZE="1g"
|
|
LS_LOG_DIR=/var/log/logstash
|
|
LS_LOG_FILE="${LS_LOG_DIR}/$name.log"
|
|
LS_CONF_DIR=/etc/logstash/conf.d
|
|
LS_OPEN_FILES=16384
|
|
LS_NICE=19
|
|
LS_OPTS=""
|
|
|
|
|
|
[ -r /etc/default/$name ] && . /etc/default/$name
|
|
[ -r /etc/sysconfig/$name ] && . /etc/sysconfig/$name
|
|
|
|
program=/opt/logstash/bin/logstash
|
|
args="-f ${LS_CONF_DIR} -l ${LS_LOG_FILE} ${LS_OPTS}"
|
|
|
|
quiet() {
|
|
"$@" > /dev/null 2>&1
|
|
return $?
|
|
}
|
|
|
|
start() {
|
|
|
|
LS_JAVA_OPTS="${LS_JAVA_OPTS} -Djava.io.tmpdir=${LS_HOME}"
|
|
HOME=${LS_HOME}
|
|
export PATH HOME LS_HEAP_SIZE LS_JAVA_OPTS LS_USE_GC_LOGGING LS_GC_LOG_FILE
|
|
|
|
# chown doesn't grab the suplimental groups when setting the user:group - so we have to do it for it.
|
|
# Boy, I hope we're root here.
|
|
SGROUPS=$(id -Gn "$LS_USER" | tr " " "," | sed 's/,$//'; echo '')
|
|
|
|
if [ ! -z $SGROUPS ]
|
|
then
|
|
EXTRA_GROUPS="--groups $SGROUPS"
|
|
fi
|
|
|
|
# set ulimit as (root, presumably) first, before we drop privileges
|
|
ulimit -n ${LS_OPEN_FILES}
|
|
|
|
# Run the program!
|
|
nice -n ${LS_NICE} chroot --userspec $LS_USER:$LS_GROUP $EXTRA_GROUPS / sh -c "
|
|
cd $LS_HOME
|
|
ulimit -n ${LS_OPEN_FILES}
|
|
exec \"$program\" $args
|
|
" > "${LS_LOG_DIR}/$name.stdout" 2> "${LS_LOG_DIR}/$name.err" &
|
|
|
|
# Generate the pidfile from here. If we instead made the forked process
|
|
# generate it there will be a race condition between the pidfile writing
|
|
# and a process possibly asking for status.
|
|
echo $! > $pidfile
|
|
|
|
echo "$name started."
|
|
return 0
|
|
}
|
|
|
|
stop() {
|
|
# Try a few times to kill TERM the program
|
|
if status ; then
|
|
pid=`cat "$pidfile"`
|
|
echo "Killing $name (pid $pid) with SIGTERM"
|
|
kill -TERM $pid
|
|
# Wait for it to exit.
|
|
for i in 1 2 3 4 5 6 7 8 9 ; do
|
|
echo "Waiting $name (pid $pid) to die..."
|
|
status || break
|
|
sleep 1
|
|
done
|
|
if status ; then
|
|
if [ $KILL_ON_STOP_TIMEOUT -eq 1 ] ; then
|
|
echo "Timeout reached. Killing $name (pid $pid) with SIGKILL. This may result in data loss."
|
|
kill -KILL $pid
|
|
echo "$name killed with SIGKILL."
|
|
else
|
|
echo "$name stop failed; still running."
|
|
fi
|
|
else
|
|
echo "$name stopped."
|
|
fi
|
|
fi
|
|
}
|
|
|
|
status() {
|
|
if [ -f "$pidfile" ] ; then
|
|
pid=`cat "$pidfile"`
|
|
if kill -0 $pid > /dev/null 2> /dev/null ; then
|
|
# process by this pid is running.
|
|
# It may not be our pid, but that's what you get with just pidfiles.
|
|
# TODO(sissel): Check if this process seems to be the same as the one we
|
|
# expect. It'd be nice to use flock here, but flock uses fork, not exec,
|
|
# so it makes it quite awkward to use in this case.
|
|
return 0
|
|
else
|
|
return 2 # program is dead but pid file exists
|
|
fi
|
|
else
|
|
return 3 # program is not running
|
|
fi
|
|
}
|
|
|
|
reload() {
|
|
if status ; then
|
|
kill -HUP `cat "$pidfile"`
|
|
fi
|
|
}
|
|
|
|
force_stop() {
|
|
if status ; then
|
|
stop
|
|
status && kill -KILL `cat "$pidfile"`
|
|
fi
|
|
}
|
|
|
|
configtest() {
|
|
# Check if a config file exists
|
|
if [ ! "$(ls -A ${LS_CONF_DIR}/* 2> /dev/null)" ]; then
|
|
echo "There aren't any configuration files in ${LS_CONF_DIR}"
|
|
return 1
|
|
fi
|
|
|
|
HOME=${LS_HOME}
|
|
export PATH HOME
|
|
|
|
test_args="--configtest -f ${LS_CONF_DIR} ${LS_OPTS}"
|
|
$program ${test_args}
|
|
[ $? -eq 0 ] && return 0
|
|
# Program not configured
|
|
return 6
|
|
}
|
|
|
|
case "$1" in
|
|
start)
|
|
status
|
|
code=$?
|
|
if [ $code -eq 0 ]; then
|
|
echo "$name is already running"
|
|
else
|
|
start
|
|
code=$?
|
|
fi
|
|
exit $code
|
|
;;
|
|
stop) stop ;;
|
|
force-stop) force_stop ;;
|
|
status)
|
|
status
|
|
code=$?
|
|
if [ $code -eq 0 ] ; then
|
|
echo "$name is running"
|
|
else
|
|
echo "$name is not running"
|
|
fi
|
|
exit $code
|
|
;;
|
|
reload) reload ;;
|
|
restart)
|
|
|
|
quiet configtest
|
|
RET=$?
|
|
if [ ${RET} -ne 0 ]; then
|
|
echo "Configuration error. Not restarting. Re-run with configtest parameter for details"
|
|
exit ${RET}
|
|
fi
|
|
stop && start
|
|
;;
|
|
configtest)
|
|
configtest
|
|
exit $?
|
|
;;
|
|
*)
|
|
echo "Usage: $SCRIPTNAME {start|stop|force-stop|status|reload|restart|configtest}" >&2
|
|
exit 3
|
|
;;
|
|
esac
|
|
|
|
exit $?
|