Quantcast
Channel: Ignite Realtime : Discussion List - All Communities
Viewing all articles
Browse latest Browse all 10742

Bug in Redhat init script

$
0
0

The redhat init script is incorrect and does not work with OpenSUSE under systemd.  Looking into it, I found that the problem is that the pidfile is not persistent - it is only created upon shutdown and then immediately removed, as a foil for kill proc.

 

I submitted a patch through the opensuse build system that fixes this problem - it probably should be rolled upstream.  The opensuse build request is at https://build.opensuse.org/request/show/223463.  I'm not providing a diff here because the diff in the opensuse build file is predicated upon a couple of additional patches.  But here is the init script I'm using.  It works correctly on opensuse, and should not work incorrectly anywhere else, either.

 

arguably status() should be a little smarter in checking the pidfile to see if it matches the running process (if there is one), and start() should be a little smarter in checking for an existing pidfile, but I don't have the time to make it completely buttoned down for now...

 

#!/bin/sh
#
# openfire      Stops and starts the Openfire XMPP service.
#
# chkconfig: 2345 99 1
# description: Openfire is an XMPP server, which is a server that facilitates \
#              XML based communication, such as chat.
# config: /opt/openfire/conf/openfire.xml
# config: /etc/sysconfig/openfire
# pidfile: /var/run/openfire.pid
#
# This script has currently been tested on Redhat, CentOS, and Fedora  based
# systems.
#

#####
# Begin setup work
#####

# Initialization
PATH="/sbin:/bin:/usr/bin:/usr/sbin"
RETVAL=0

# Check that we are root ... so non-root users stop here.
if [ "`id -u`" != 0 ]; then
        echo $0 must be run as root        exit 1
fi

# Get config.
[ -f "/etc/sysconfig/openfire" ] && . /etc/sysconfig/openfire
if [ -f "/etc/init.d/functions" ]; then  FUNCTIONS_FOUND=true  . /etc/init.d/functions
fi

# If openfire user is not set in sysconfig, set to daemon.
[ -z "$OPENFIRE_USER" ] && OPENFIRE_USER="daemon"

# If pid file path is not set in sysconfig, set to /var/run/openfire.pid.
[ -z "$OPENFIRE_PIDFILE" ] && OPENFIRE_PIDFILE="/var/run/openfire.pid"

# -----------------------------------------------------------------

# If a openfire home variable has not been specified, try to determine it.
if [ -z "$OPENFIRE_HOME" -o ! -d "$OPENFIRE_HOME" ]; then
        if [ -d "/usr/share/openfire" ]; then                OPENFIRE_HOME="/usr/share/openfire"        elif [ -d "/usr/local/openfire" ]; then                OPENFIRE_HOME="/usr/local/openfire"        elif [ -d "/opt/openfire" ]; then                OPENFIRE_HOME="/opt/openfire"        else                echo "Could not find Openfire installation under /opt, /usr/share, or /usr/local."                echo "Please specify the Openfire installation location as variable OPENFIRE_HOME"                echo "in /etc/sysconfig/openfire."                exit 1        fi
fi

# If log path is not set in sysconfig, set to $OPENFIRE_HOME/logs.
[ -z "$OPENFIRE_LOGDIR" ] && OPENFIRE_LOGDIR="${OPENFIRE_HOME}/logs"

# Attempt to locate java installation.
if [ -z "$JAVA_HOME" ]; then
        if [ -d "${OPENFIRE_HOME}/jre" ]; then                JAVA_HOME="${OPENFIRE_HOME}/jre"        elif [ -d "/etc/alternatives/jre" ]; then                JAVA_HOME="/etc/alternatives/jre"        else                jdks=`ls -r1d /usr/java/j*`                for jdk in $jdks; do                        if [ -f "${jdk}/bin/java" ]; then                                JAVA_HOME="$jdk"                                break                        fi                done        fi
fi
JAVACMD="${JAVA_HOME}/bin/java"

if [ ! -d "$JAVA_HOME" -o ! -x "$JAVACMD" ]; then
        echo "Error: JAVA_HOME is not defined correctly."        echo "       Can not sure execute $JAVACMD."        exit 1
fi

# Prepare location of openfire libraries
OPENFIRE_LIB="${OPENFIRE_HOME}/lib"

# Prepare openfire command line
OPENFIRE_OPTS="${OPENFIRE_OPTS} -DopenfireHome=${OPENFIRE_HOME} -Dopenfire.lib.dir=${OPENFIRE_LIB}"

# Prepare local java class path
if [ -z "$LOCALCLASSPATH" ]; then
        LOCALCLASSPATH="${OPENFIRE_LIB}/startup.jar"
else        LOCALCLASSPATH="${OPENFIRE_LIB}/startup.jar:${LOCALCLASSPATH}"
fi

# Export any necessary variables
export JAVA_HOME JAVACMD

# Lastly, prepare the full command that we are going to run.
OPENFIRE_RUN_CMD="${JAVACMD} -server ${OPENFIRE_OPTS} -classpath \"${LOCALCLASSPATH}\" -jar \"${OPENFIRE_LIB}/startup.jar\""

#####
# End setup work
#####



start() {
        OLD_PWD=`pwd`        cd $OPENFIRE_LOGDIR        PID=$(findPID)        if [ -n "$PID" ]; then            echo "Openfire is already running."            RETVAL=1            return        fi        # Start daemons.        echo -n "Starting openfire: "        rm -f nohup.out        su -s /bin/sh -c "nohup $OPENFIRE_RUN_CMD > $OPENFIRE_LOGDIR/nohup.out 2>&1 &" $OPENFIRE_USER        RETVAL=$?        echo        [ $RETVAL -eq 0 -a -d /var/run ] && touch /var/run/openfire        sleep 1 # allows prompt to return        PID=$(findPID)        echo $PID > $OPENFIRE_PIDFILE        cd $OLD_PWD
}

stop() {
        # Stop daemons.        echo -n "Shutting down openfire: "        if [ -f "$OPENFIRE_PIDFILE" ]; then                killproc -p $OPENFIRE_PIDFILE -d 10                rm -f $OPENFIRE_PIDFILE        else                PID=$(findPID)                if [ -n $PID ]; then                        kill $PID                else                        echo "Openfire is not running."                fi        fi        RETVAL=$?        echo        [ $RETVAL -eq 0 -a -f "/var/run/openfire" ] && rm -f /var/run/openfire
}

restart() {
        stop        sleep 10 # give it a few moments to shut down        start
}

condrestart() {
        [ -e "/var/run/openfire" ] && restart        return 0
}

status() {
        PID=$(findPID)        if [ -n "$PID" ]; then                echo "openfire is running"                RETVAL=0        else                echo "openfire is not running"                RETVAL=1        fi
}

findPID() {
        echo `ps ax --width=1000 | grep openfire | grep startup.jar | awk '{print $1}'`
}

# Handle how we were called.
case "$1" in
        start)                start                ;;        stop)                stop                ;;        restart)                restart                ;;        condrestart)                condrestart                ;;        reload)                restart                ;;        status)                status                ;;        *)                echo "Usage $0 {start|stop|restart|status|condrestart|reload}"                RETVAL=1
esac

exit $RETVAL

Viewing all articles
Browse latest Browse all 10742

Trending Articles