#!/bin/sh # # init.d script for the Gearman worker daemon of PNP4Nagios # # Based on an example script for NPCD of Javier Fernandez-Sanguino # Copyright (c) 2007 Javier Fernandez-Sanguino # Copyright (c) 2011 Sebastian Harl # ### BEGIN INIT INFO # Provides: pnp_gearman_worker # Required-Start: $network $local_fs $remote_fs # Required-Stop: $network $local_fs $remote_fs # Should-Start: # Should-Stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: PNP4Nagios Gearman worker daemon # Description: Processing of Nagios' perf data in distributed setups ### END INIT INFO PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DAEMON=/usr/lib/pnp4nagios/libexec/process_perfdata.pl NAME=pnp_gearman_worker DESC="PNP4Nagios Gearman worker daemon" PIDFILE=/var/run/pnp4nagios/$NAME.pid test -x $DAEMON || exit 0 . /lib/lsb/init-functions # Default options, these can be overriden by the information # at /etc/default/$NAME DAEMON_OPTS="" DIETIME=10 STARTTIME=2 USER=nagios if [ -f /etc/default/pnp_gearman_worker ] ; then . /etc/default/pnp_gearman_worker fi if [ "x$RUN" != "xyes" ] ; then echo "$NAME has been disabled in /etc/default/pnp_gearman_worker." exit 0 fi set -e # Check if a given process pid's cmdline matches a given name running_pid() { pid=$1 name=$2 [ -z "$pid" ] && return 1 [ ! -d /proc/$pid ] && return 1 cmd=`cat /proc/$pid/cmdline | tr "\000" "\n" | head -n 1 | cut -d : -f 1` # Is this the expected server [ "$cmd" != "$name" ] && return 1 return 0 } # Check if the process is running looking at /proc # (works for all users) running() { # No pidfile, probably no daemon present [ ! -f "$PIDFILE" ] && return 1 pid=`cat $PIDFILE` running_pid "$pid" $DAEMON \ || running_pid "$pid" "/usr/bin/perl" || return 1 return 0 } # Start the process using the wrapper start_server() { if ! perl -MGearman::Worker -e '1;' > /dev/null 2>&1 \ || ! perl -MMIME::Base64 -e '1;' > /dev/null 2>&1 \ || ! perl -MCrypt::Rijndael -e '1;' > /dev/null 2>&1; then echo "$NAME requires the Gearman::Worker, MIME::Base64 and" >&2 echo "Crypt::Rijndael Perl modules. Make sure that the packages" >&2 echo "perl, libgearman-client-perl and libcrypt-rijndael-perl" >&2 echo "are installed." >&2 exit 1 fi if [ -d /var/run/pnp4nagios ]; then chmod 755 /var/run/pnp4nagios chown nagios.nagios /var/run/pnp4nagios else install -d -m 755 -o nagios -g nagios /var/run/pnp4nagios fi start_opts="--start --quiet --oknodo --pidfile $PIDFILE" if [ -n "$USER" ]; then start_opts="$start_opts --chuid $USER" fi start-stop-daemon $start_opts --exec $DAEMON -- \ --pidfile=$PIDFILE --gearman --daemon $DAEMON_OPTS errcode=$? return $errcode } # Stop the process using the wrapper stop_server() { killproc -p $PIDFILE $DAEMON errcode=$? return $errcode } # Force the process to die killing it manually force_stop() { [ ! -e "$PIDFILE" ] && return if running ; then kill -15 $pid # Is it really dead? sleep "$DIETIME"s if running ; then kill -9 $pid sleep "$DIETIME"s if running ; then echo "Cannot kill $NAME (pid=$pid)!" exit 1 fi fi fi rm -f $PIDFILE } case "$1" in start) log_daemon_msg "Starting $DESC" "$NAME" # Check if it's running first if running ; then log_progress_msg "apparently already running" log_end_msg 0 exit 0 fi if start_server ; then # NOTE: Some servers might die some time after they start, # this code will detect this issue if STARTTIME is set # to a reasonable value [ -n "$STARTTIME" ] && sleep $STARTTIME # Wait some time if running ; then # It's ok, the server started and is running log_end_msg 0 else # It is not running after we did start log_end_msg 1 fi else # Either we could not start it log_end_msg 1 fi ;; stop) log_daemon_msg "Stopping $DESC" "$NAME" if running ; then # Only stop the server if we see it running errcode=0 stop_server || errcode=$? log_end_msg $errcode else # If it's not running don't do anything log_progress_msg "apparently not running" log_end_msg 0 exit 0 fi ;; force-stop) # First try to stop gracefully the program $0 stop if running; then # If it's still running try to kill it more forcefully log_daemon_msg "Stopping (force) $DESC" "$NAME" errcode=0 force_stop || errcode=$? log_end_msg $errcode fi ;; restart|force-reload) log_daemon_msg "Restarting $DESC" "$NAME" errcode=0 stop_server || errcode=$? # Wait some sensible amount, some server need this [ -n "$DIETIME" ] && sleep $DIETIME start_server || errcode=$? [ -n "$STARTTIME" ] && sleep $STARTTIME running || errcode=$? log_end_msg $errcode ;; status) log_daemon_msg "Checking status of $DESC" "$NAME" if running ; then log_progress_msg "running" log_end_msg 0 else log_progress_msg "apparently not running" log_end_msg 1 exit 1 fi ;; *) N=/etc/init.d/$NAME echo "Usage: $N {start|stop|force-stop|restart|force-reload|status}" >&2 exit 1 ;; esac exit 0