Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/sh
- # Init script for logstash
- # Maintained by Elasticsearch
- # Generated by pleaserun.
- # Modified by Gregory GERARD.
- # 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="500m"
- 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="agent -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
- # 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}
- for logstash_file_full in ${LS_CONF_DIR}/*; do
- logstash_file_simple=$(basename $logstash_file_full .conf)
- LS_LOG_FILE="${LS_LOG_DIR}/$(basename "$logstash_file_simple").log"
- args="agent -f ${logstash_file_full} -l ${LS_LOG_FILE} ${LS_OPTS}"
- pidfile="/var/run/$logstash_file_simple.pid"
- # echo ${args} $pidfile
- # 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}/$logstash_file_simple.stdout" 2> "${LS_LOG_DIR}/$logstash_file_simple.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 $logstash_file_simple started."
- done
- return 0
- }
- stop() {
- # Try a few times to kill TERM the program
- for logstash_file_full in ${LS_CONF_DIR}/*; do
- logstash_file_simple=$(basename $logstash_file_full .conf)
- pidfile="/var/run/$logstash_file_simple.pid"
- if status $logstash_file_full; 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 ; do
- echo "Waiting $name (pid $pid) to die..."
- status $logstash_file_full || break
- sleep 1
- done
- if status $logstash_file_full; then
- if [ "$KILL_ON_STOP_TIMEOUT" -eq 1 ] ; then
- echo "Timeout reached. Killing $logstash_file_simple (pid $pid) with SIGKILL. This may result in data loss."
- kill -KILL $pid
- echo "$logstash_file_simple killed with SIGKILL."
- else
- echo "$logstash_file_simple stop failed; still running."
- fi
- else
- echo "$logstash_file_simple stopped."
- fi
- fi
- done
- }
- status() {
- logstash_file_simple=$(basename $1 .conf)
- pidfile="/var/run/$logstash_file_simple.pid"
- 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
- }
- force_stop() {
- for logstash_file_full in ${LS_CONF_DIR}/*; do
- logstash_file_simple=$(basename $logstash_file_full .conf)
- status $logstash_file_full
- if status ; then
- stop
- if status; then
- pidfile="/var/run/$logstash_file_simple.pid"
- kill -KILL `cat "$pidfile"`
- fi
- fi
- done
- }
- configtest() {
- # Check if a config file exists
- if [ ! "$(ls -A ${LS_CONF_DIR}/* 2> /dev/null)" ]; then
- log_failure_msg "There aren't any configuration files in ${LS_CONF_DIR}"
- exit 1
- fi
- JAVA_OPTS=${LS_JAVA_OPTS}
- HOME=${LS_HOME}
- export PATH HOME JAVA_OPTS LS_HEAP_SIZE LS_JAVA_OPTS LS_USE_GC_LOGGING
- test_args="-f ${LS_CONF_DIR} --configtest ${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)
- for logstash_file_full in ${LS_CONF_DIR}/*; do
- status $logstash_file_full
- code=$?
- if [ $code -eq 0 ] ; then
- echo "$logstash_file_full is running"
- else
- echo "$logstash_file_full is not running"
- fi
- done
- exit $code
- ;;
- 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|restart|configtest}" >&2
- exit 3
- ;;
- esac
- exit $?
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement