diff options
Diffstat (limited to 'src/pmie/rc_pmie')
-rw-r--r-- | src/pmie/rc_pmie | 273 |
1 files changed, 273 insertions, 0 deletions
diff --git a/src/pmie/rc_pmie b/src/pmie/rc_pmie new file mode 100644 index 0000000..acef291 --- /dev/null +++ b/src/pmie/rc_pmie @@ -0,0 +1,273 @@ +#!/bin/sh +# +# Copyright (c) 2012 Red Hat. +# Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# The following is for chkconfig on RedHat based systems +# chkconfig: 2345 94 06 +# description: pmie is a performance inference engine for the Performance Co-Pilot (PCP) +# +# The following is for insserv(1) based systems, +# e.g. SuSE, where chkconfig is a perl script. +### BEGIN INIT INFO +# Provides: pmie +# Required-Start: $remote_fs +# Should-Start: $local_fs $network $syslog $time $pmcd +# Required-Stop: $remote_fs +# Should-Stop: $local_fs $network $syslog $pmcd +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Control pmie (performance inference engine for PCP) +# Description: Configure and control pmie (the performance inference engine for the Performance Co-Pilot) +### END INIT INFO + +. $PCP_DIR/etc/pcp.env +. $PCP_SHARE_DIR/lib/rc-proc.sh + +PMIECTRL=$PCP_PMIECONTROL_PATH +pmprog=$PCP_RC_DIR/pmie +prog=$PCP_RC_DIR/`basename $0` + +# search for your mail agent of choice ... +# +MAIL='' +for try in Mail mail email +do + if which $try >/dev/null 2>&1 + then + MAIL=$try + break + fi +done + +tmp=`mktemp -d /var/tmp/pcp.XXXXXXXXX` || exit 1 +status=1 +trap "rm -rf $tmp; exit \$status" 0 1 2 3 15 + +if [ $pmprog = $prog ] +then + VERBOSE_CTL=on +else + VERBOSE_CTL=off +fi + +id=`id | sed -e "s/(.*//" -e "s/.*=//"` +if [ "$id" != 0 -a "$1" != "status" ] +then + if [ -n "$PCP_DIR" ] + then + : running in a non-default installation, do not need to be root + else + echo "$prog:"' +Error: You must be root (uid 0) to start or stop pmie.' + exit + fi +fi + +_usage() +{ + echo "Usage: $pmprog [-v] {start|restart|condrestart|stop|status|reload|force-reload}" +} + +_reboot_setup() +{ + # base directories and house-keeping for pmie instances + # + if [ ! -d "$PCP_TMP_DIR/pmie" ] + then + mkdir -p -m 0775 "$PCP_TMP_DIR/pmie" + chown $PCP_USER:$PCP_GROUP "$PCP_TMP_DIR/pmie" + else + rm -rf $tmp/ent $tmp/pid + here=`pwd` + cd "$PCP_TMP_DIR/pmie" + _get_pids_by_name pmie | sort >$tmp/pid + ls [0-9]* 2>&1 | sed -e '/\[0-9]\*/d' \ + | sed -e 's/[ ][ ]*//g' | sort >$tmp/ent + # remove entries without a pmie process + rm -f `comm -23 $tmp/ent $tmp/pid` + rm -f $tmp/ent $tmp/pid + cd "$here" + fi +} + +# Note: _start_pmie is running in the background, in parallel with +# the rest of the script. It might complete well after the caller +# so tmpfile handling is especially problematic. Goal is to speed +# bootup by starting potentially slow (remote monitoring) processes +# in the background. +# +_start_pmie() +{ + bgstatus=0 + bgtmp=`mktemp -d /var/tmp/pcp.XXXXXXXXX` || exit 1 + trap "rm -rf $bgtmp; exit \$bgstatus" 0 1 2 3 15 + + wait_option='' + [ ! -z "$PMCD_WAIT_TIMEOUT" ] && wait_option="-t $PMCD_WAIT_TIMEOUT" + + if pmcd_wait $wait_option + then + pmie_check >$bgtmp/pmie 2>&1 + bgstatus=$? + if [ -s $bgtmp/pmie ] + then + $PCP_BINADM_DIR/pmpost "pmie_check start failed in $prog, mailing output to root" + if [ ! -z "$MAIL" ] + then + $MAIL -s "pmie_check start failed in $prog" root <$bgtmp/pmie >/dev/null 2>&1 + else + echo "$prog: pmie_check start failed ..." + cat $bgtmp/pmie + fi + fi + else + bgstatus=$? + $PCP_BINADM_DIR/pmpost "pmcd_wait failed in $prog: exit status: $bgstatus" + if [ ! -z "$MAIL" ] + then + echo "pmcd_wait: exit status: $bgstatus" | $MAIL -s "pmcd_wait failed in $prog" root + else + echo "$prog: pmcd_wait failed ..." + echo "pmcd_wait: exit status: $bgstatus" + fi + fi + exit $bgstatus # co-process is now complete +} + +_shutdown() +{ + _get_pids_by_name pmie >$tmp/pmies 2>&1 + if [ ! -s $tmp/pmies ] + then + [ "$1" = verbose ] && echo "$pmprog: PMIE not running" + return 0 + fi + + [ "$1" = quietly ] || \ + $ECHO $PCP_ECHO_N "Waiting for pmie process(es) to terminate ..." "$PCP_ECHO_C" + + pmie_check -s >$tmp/pmie 2>&1 + if [ -s $tmp/pmie ] + then + $PCP_BINADM_DIR/pmpost "pmie_check stop failed in $prog, mailing output to root" + if [ ! -z "$MAIL" ] + then + $MAIL -s "pmie_check stop failed in $prog" root <$tmp/pmie + else + echo "$prog: pmie_check stop failed ..." + cat $tmp/pmie + fi + fi + + true + $RC_STATUS -v + rm -fr "$tmp/pmie" "$PCP_TMP_DIR"/pmie/* + $PCP_BINADM_DIR/pmpost "stop pmie from $pmprog" +} + +while getopts v c +do + case $c + in + v) # force verbose + VERBOSE_CTL=on + ;; + *) + _usage + exit 1 + ;; + esac +done +shift `expr $OPTIND - 1` + +if [ $VERBOSE_CTL = on ] +then # For a verbose startup and shutdown + ECHO=$PCP_ECHO_PROG +else # For a quiet startup and shutdown + ECHO=: +fi + +case "$1" in + 'start'|'restart'|'condrestart'|'reload'|'force-reload') + if [ "$1" = "condrestart" ] && ! is_chkconfig_on pmie + then + status=0 + exit + fi + + _shutdown quietly + + # messages should go to stderr, not the GUI notifiers + # + unset PCP_STDERR + + _reboot_setup + + if which pmie >/dev/null 2>&1 + then + if is_chkconfig_on pmie + then + if which pmie_check >/dev/null 2>&1 + then + if [ ! -f $PMIECTRL ] + then + echo "$prog:"' +Error: PCP inference engine control file '$PMIECTRL' + is missing! Cannot start any Performance Co-Pilot inference engine(s).' + else + $ECHO $PCP_ECHO_N "Starting pmie ..." "$PCP_ECHO_C" + _start_pmie & + $RC_STATUS -v + fi + fi + elif [ "$0" = "$PCP_RC_DIR/pmie" ] + then + echo "$prog: Warning: Performance Co-Pilot Inference Engine (pmie) is disabled." + chkconfig_on_msg pmie + fi + fi + status=0 + ;; + + 'stop') + _shutdown verbose + status=0 + ;; + + 'status') + # NOTE: $RC_CHECKPROC returns LSB compliant status values. + $ECHO $PCP_ECHO_N "Checking for pmie:" "$PCP_ECHO_C" + if [ -r /etc/rc.status ] + then + # SuSE + $RC_CHECKPROC pmie + $RC_STATUS -v + status=$? + else + # not SuSE + $RC_CHECKPROC pmie + status=$? + if [ $status -eq 0 ] + then + $ECHO running + else + $ECHO stopped + fi + fi + ;; + *) + _usage + ;; +esac + |