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