From 02235262de230481af3d193ef8a26a3808ceb3f3 Mon Sep 17 00:00:00 2001 From: Kyrill Poole Date: Tue, 5 May 2015 09:39:21 +0100 Subject: [PATCH] replaced Logstash initscript with one tailored for Logstash-forwarder --- .../etc/init.d/logstashforwarder.Debian.erb | 316 ++++++++---------- 1 file changed, 136 insertions(+), 180 deletions(-) diff --git a/templates/etc/init.d/logstashforwarder.Debian.erb b/templates/etc/init.d/logstashforwarder.Debian.erb index 210d761..22c9a31 100644 --- a/templates/etc/init.d/logstashforwarder.Debian.erb +++ b/templates/etc/init.d/logstashforwarder.Debian.erb @@ -1,203 +1,159 @@ -#!/bin/bash -# -# /etc/init.d/logstash -- startup script for LogStash. +#!/bin/sh +# Init script for logstash-forwarder +# Maintained by @poolski +# Generated by pleaserun. +# Implemented based on LSB Core 3.1: +# * Sections: 20.2, 20.3 # ### BEGIN INIT INFO -# Provides: logstash -# Required-Start: $all -# Required-Stop: $all +# Provides: logstash-forwarder +# Required-Start: $remote_fs $syslog +# Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 -# Short-Description: Starts logstash -# Description: Starts logstash using start-stop-daemon +# Short-Description: +# Description: Logstash event forwarder ### END INIT INFO -set -e - -PATH=/bin:/usr/bin:/sbin:/usr/sbin -NAME=logstash -DESC="Logstash Daemon" -DEFAULT=/etc/default/$NAME - -if [ `id -u` -ne 0 ]; then - echo "You need root privileges to run this script" - exit 1 -fi - -. /lib/lsb/init-functions - -if [ -r /etc/default/rcS ]; then - . /etc/default/rcS -fi - -# The following variables can be overwritten in $DEFAULT - -# Run logstash as this user ID and group ID -LS_USER=logstash -LS_GROUP=logstash - -JAVA=/usr/bin/java - -# Directory where the logstash all in one jar lives -LS_HOME=/var/lib/logstash - -# Additional Java OPTS -LS_JAVA_OPTS=" -Djava.io.tmpdir=/var/logstash/" - -# logstash log directory -LOG_DIR=/var/log/logstash +PATH=/sbin:/usr/sbin:/bin:/usr/bin +export PATH + +name=logstash-forwarder +program=/opt/logstash-forwarder/bin/logstash-forwarder +# Runtime arguments +# Tune -spool-size to get optimum performance. Beware of setting it too high +# or your nodes will overwhelm your indexer/relay with events as they'll send +# N events per batch, where N is -spool-size. +args='-config /etc/logstash-forwarder.conf -log-to-syslog -spool-size 100' +pidfile="/var/run/$name.pid" + +# Load environment variables +user="root" +group="root" +chroot="/" +chdir="/" +nice="" + +trace() { + logger -t "/etc/init.d/logstash-forwarder" "$@" +} -# logstash configuration directory -CONF_DIR=/etc/logstash/conf.d +emit() { + trace "$@" + echo "$@" +} -# logstash log file -LOG_FILE=$LOG_DIR/$NAME.log +start() { -# Open File limit -OPEN_FILES=2048 -# LogStash options -LS_OPTS="--log ${LOG_DIR}/${NAME}.log" + # Setup any environmental stuff beforehand + -# Nice level -NICE=19 + # Run the program! + + chroot --userspec "$user":"$group" "$chroot" sh -c " + + cd \"$chdir\" + exec \"$program\" $args + " > /var/log/$name.log 2> /var/log/$name.err & -# End of variables that can be overwritten in $DEFAULT + # 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 -# overwrite settings from default file -if [ -f "$DEFAULT" ]; then - . "$DEFAULT" -fi + emit "$name started" + return 0 +} -# Define other required variables -PID_FILE=/var/run/$NAME.pid -DAEMON=$LS_JAR -DAEMON_OPTS="agent -f ${CONF_DIR} ${LS_OPTS}" +stop() { + # Try a few times to kill TERM the program + if status ; then + pid=$(cat "$pidfile") + trace "Killing $name (pid $pid) with SIGTERM" + kill -TERM $pid + # Wait for it to exit. + for i in 1 2 3 4 5 ; do + trace "Waiting $name (pid $pid) to die..." + status || break + sleep 1 + done + if status ; then + emit "$name stop failed; still running." + else + emit "$name stopped." + fi + fi +} -is_true() { - if [ "x$1" = "xtrue" -o "x$1" = "xyes" -o "x$1" = "x1" ] ; then - return 0 +status() { + if [ -f "$pidfile" ] ; then + pid=$(cat "$pidfile") + if ps -p $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 1 + return 2 # program is dead but pid file exists fi + else + return 3 # program is not running + fi +} + +force_stop() { + if status ; then + stop + status && kill -KILL $(cat "$pidfile") + fi } -# Check DAEMON exists -if ! test -e $DAEMON; then - log_failure_msg "Daemon $DAEMON doesn't exist" - exit 1 -fi case "$1" in - start) - if ! is_true "$START" ; then - echo "logstash not configured to start, please edit /etc/default/logstash to enable" - exit 0 - fi - - if [ -z "$JAVA" ]; then - log_failure_msg "no JDK found - $JAVA" - exit 1 - fi - - # Check if a config file exists - if [ ! "$(ls -A $CONF_DIR/*.conf 2> /dev/null)" ]; then - log_failure_msg "There aren't any configuration files in $CONF_DIR" - exit 1 - fi - - log_daemon_msg "Starting $DESC" - - if start-stop-daemon --test --start --pidfile "$PID_FILE" \ - --user "$LS_USER" --exec "$JAVA" \ - >/dev/null; then - # Prepare environment - ulimit -n $OPEN_FILES - - # Start Daemon - start-stop-daemon --start -b --user "$LS_USER" -c "$LS_USER":"$LS_GROUP" \ - -d "$LS_HOME" --pidfile "$PID_FILE" --make-pidfile \ - -N $NICE \ - --exec "$JAVA" -- $LS_JAVA_OPTS -jar $DAEMON $DAEMON_OPTS - - sleep 1 - - if start-stop-daemon --test --start --pidfile "$PID_FILE" \ - --user "$LS_USER" --exec "$JAVA" \ - >/dev/null; then - - if [ -f "$PID_FILE" ]; then - rm -f "$PID_FILE" - fi - - log_end_msg 1 - else - log_end_msg 0 - fi - else - log_progress_msg "(already running)" - log_end_msg 0 - fi - ;; - stop) - log_daemon_msg "Stopping $DESC" - - set +e - - if [ -f "$PID_FILE" ]; then - start-stop-daemon --stop --pidfile "$PID_FILE" \ - --user "$LS_USER" \ - --retry=TERM/20/KILL/5 >/dev/null - - if [ $? -eq 1 ]; then - log_progress_msg "$DESC is not running but pid file exists, cleaning up" - elif [ $? -eq 3 ]; then - PID="`cat $PID_FILE`" - log_failure_msg "Failed to stop $DESC (pid $PID)" - exit 1 - fi - - rm -f "$PID_FILE" - else - log_progress_msg "(not running)" - fi - - log_end_msg 0 - set -e - ;; - status) - set +e - - start-stop-daemon --test --start --pidfile "$PID_FILE" \ - --user "$LS_USER" --exec "$JAVA" \ - >/dev/null 2>&1 - - if [ "$?" = "0" ]; then - if [ -f "$PID_FILE" ]; then - log_success_msg "$DESC is not running, but pid file exists." - exit 1 - else - log_success_msg "$DESC is not running." - exit 3 - fi - else - log_success_msg "$DESC is running with pid `cat $PID_FILE`" - fi - - set -e - ;; - restart|force-reload) - if [ -f "$PID_FILE" ]; then - $0 stop - sleep 1 - fi - - $0 start - ;; - *) - log_success_msg "Usage: $0 {start|stop|restart|force-reload|status}" - exit 1 - ;; + force-start|start|stop|force-stop|restart) + trace "Attempting '$1' on logstash-forwarder" + ;; +esac + +case "$1" in + force-start) + PRESTART=no + exec "$0" start + ;; + start) + status + code=$? + if [ $code -eq 0 ]; then + emit "$name is already running" + exit $code + else + start + exit $? + fi + ;; + stop) stop ;; + force-stop) force_stop ;; + status) + status + code=$? + if [ $code -eq 0 ] ; then + emit "$name is running" + else + emit "$name is not running" + fi + exit $code + ;; + restart) + + stop && start + ;; + *) + echo "Usage: $SCRIPTNAME {start|force-start|stop|force-start|force-stop|status|restart}" >&2 + exit 3 + ;; esac -exit 0 +exit $?