• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] /etc/init.d/ - Status für Java-Applikation

mucker

Newbie
Hallo,

Ich habe OpenSuse 11.0/GNOME und Glassfish 9.1_02 installiert.

Um den Application Server (Glassfish) beim Booten automatisch zu starten, habe ich anhand /etc/init.d/skeleton ein Skript /etc/init.d/glassfish erstellt sowie Links /etc/init.d/rc5.d/S99glassfish und /etc/init.d/rc5.d/K99glassfish.

Hier ist /etc/init.d/glassfish (Kommentare z.g.T. rausgeschnitten):
Code:
#!/bin/sh
glassfish_BIN=/usr/share/glassfish/lib/appserv
test -x $glassfish_BIN || { echo "$glassfish_BIN not installed"; 
	if [ "$1" = "stop" ]; then exit 0;
	else exit 5; fi; }

. /etc/rc.status

# Reset status of this service
rc_reset

case "$1" in
    start)
	echo -n "Starting glassfish "
	/usr/share/glassfish/start_server

	# Remember status and be verbose
	rc_status -v
	;;
    stop)
	echo -n "Shutting down glassfish "
	 /usr/share/glassfish/stop_server

	# Remember status and be verbose
	rc_status -v
	;;
    try-restart|condrestart)
	## Do a restart only if the service was active before.
	## Note: try-restart is now part of LSB (as of 1.9).
	## RH has a similar command named condrestart.
	if test "$1" = "condrestart"; then
		echo "${attn} Use try-restart ${done}(LSB)${attn} rather than condrestart ${warn}(RH)${norm}"
	fi
	$0 status
	if test $? = 0; then
		$0 restart
	else
		rc_reset	# Not running is not a failure.
	fi
	# Remember status and be quiet
	rc_status
	;;
    restart)
	## Stop the service and regardless of whether it was
	## running or not, start it again.
	$0 stop
	$0 start

	# Remember status and be quiet
	rc_status
	;;
    force-reload)
	## Signal the daemon to reload its config. Most daemons
	## do this on signal 1 (SIGHUP).
	## If it does not support it, restart the service if it
	## is running.

	echo -n "Reload service glasshfish "
	## if it supports it:
	/sbin/killproc -HUP $glassfish_BIN
	#touch /var/run/FOO.pid
	rc_status -v

	## Otherwise:
	#$0 try-restart
	#rc_status
	;;
    reload)
	## Like force-reload, but if daemon does not support
	## signaling, do nothing (!)

	# If it supports signaling:
	echo -n "Reload service glassfish "
	/sbin/killproc -HUP $glassfish_BIN
	#touch /var/run/FOO.pid
	rc_status -v
	
	## Otherwise if it does not support reload:
	#rc_failed 3
	#rc_status -v
	;;
    status)
	echo -n "Checking for service glassfish "
	
	# NOTE: checkproc returns LSB compliant status values.
	/sbin/checkproc $glassfish_BIN
	# NOTE: rc_status knows that we called this init script with
	# "status" option and adapts its messages accordingly.
	rc_status -v
	;;
    probe)
	# test /etc/FOO/FOO.conf -nt /var/run/FOO.pid && echo reload
	;;
    *)
	echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload|probe}"
	exit 1
	;;
esac
rc_exit

Mit diesem Setup kann ich Glassfish in YaST / System Services (Runlevel) korrekt starten und stoppen, jedoch zeigt es (nicht verwunderlich) einen falschen Status an; die Implementation ist nämlich untauglich:
Glassfish ist eine Java-Applikation, d.h. das Executable des Prozesses ist die Java VM. Eigentlich müsste ich also glassfish_BIN= /usr/lib/jvm/jre/bin/java setzen. Dies erfüllt den Zweck aber gar nicht, da dann darauf getestet würde, ob irgend eine beliebige Java-Applikation läuft.
Mit 'ps -ef' sehe ich den Glassfish-Prozess wie folgt:
root 5180 1 0 Aug23 ? 00:05:02 /usr/java/jdk1.6.0_07/jre/../bin/java -Dcom.sun.aas.instanceRoot=/usr/share/glassfish/domains/domain1 -Dcom.sun.aas.ClassPathPrefix= -Dcom.sun.aas.ClassPathSuffix= -Dcom.sun.aas.ServerClassPath= -Dcom.sun.aas.classloader.appserverChainJars.ee= -Dcom.sun.aas.classloader.appserverChainJars=admin-cli.jar,admin-cli-ee.jar,j2ee-svc.jar -Dcom.sun.aas.classloader.excludesList=admin-cli.jar,appserv-upgrade.jar,sun-appserv-ant.jar -Dcom.sun.aas.classloader.optionalOverrideableChain.ee= -Dcom.sun.aas.classloader.optionalOverrideableChain=webservices-rt.jar,webservices-tools.jar -Dcom.sun.aas.classloader.serverClassPath.ee=/lib/hadbjdbc4.jar,/usr/share/glassfish/lib/SUNWjdmk/5.1/lib/jdmkrt.jar,/lib/dbstate.jar,/lib/hadbm.jar,/lib/hadbmgt.jar,/lib/mfwk_instrum_tk.jar -Dcom.sun.aas.classloader.serverClassPath=/usr/share/glassfish/lib/install/applications/jmsra/imqjmsra.jar,/usr/share/glassfish/imq/lib/jaxm-api.jar,/usr/share/glassfish/imq/lib/fscontext.jar,/usr/share/glassfish/imq/lib/imqbroker.jar,/usr/share/glassfish/imq/lib/imqjmx.jar,/usr/share/glassfish/lib/ant/lib/ant.jar,/usr/share/glassfish/lib/SUNWjdmk/5.1/lib/jdmkrt.jar -Dcom.sun.aas.classloader.sharedChainJars.ee=appserv-se.jar,appserv-ee.jar,jesmf-plugin.jar,/lib/dbstate.jar,/lib/hadbjdbc4.jar,jgroups-all.jar,/lib/mfwk_instrum_tk.jar -Dcom.sun.aas.classloader.sharedChainJars=javaee.jar,/usr/java/jdk1.6.0_07/jre/../lib/tools.jar,install/applications/jmsra/imqjmsra.jar,com-sun-commons-launcher.jar,com-sun-commons-logging.jar,/usr/share/glassfish/imq/lib/jaxm-api.jar,/usr/share/glassfish/imq/lib/fscontext.jar,/usr/share/glassfish/imq/lib/imqbroker.jar,/usr/share/glassfish/imq/lib/imqjmx.jar,/usr/share/glassfish/imq/lib/imqxm.jar,webservices-rt.jar,webservices-tools.jar,mail.jar,appserv-jstl.jar,jmxremote_optional.jar,/usr/share/glassfish/lib/SUNWjdmk/5.1/lib/jdmkrt.jar,activation.jar,appserv-rt.jar,appserv-admin.jar,appserv-cmp.jar,/usr/share/glassfish/updatecenter/lib/updatecenter.jar,/usr/share/glassfish/jbi/lib/jbi.jar,/usr/share/glassfish/imq/lib/imqjmx.jar,/usr/share/glassfish/lib/ant/lib/ant.jar,dbschema.jar -Dcom.sun.aas.configName=server-config -Dcom.sun.aas.configRoot=/usr/share/glassfish/config -Dcom.sun.aas.defaultLogFile=/usr/share/glassfish/domains/domain1/logs/server.log -Dcom.sun.aas.domainName=domain1 -Dcom.sun.aas.installRoot=/usr/share/glassfish -Dcom.sun.aas.instanceName=server -Dcom.sun.aas.processLauncher=SE -Dcom.sun.aas.promptForIdentity=true -Dcom.sun.enterprise.config.config_environment_factory_class=com.sun.enterprise.config.serverbeans.AppserverConfigEnvironmentFactory -Dcom.sun.enterprise.overrideablejavaxpackages=javax.help,javax.portlet -Dcom.sun.enterprise.taglibs=appserv-jstl.jar,jsf-impl.jar -Dcom.sun.enterprise.taglisteners=jsf-impl.jar -Dcom.sun.updatecenter.home=/usr/share/glassfish/updatecenter -Ddomain.name=domain1 -Djava.endorsed.dirs=/usr/share/glassfish/lib/endorsed -Djava.ext.dirs=/usr/java/jdk1.6.0_07/jre/../lib/ext:/usr/java/jdk1.6.0_07/jre/../jre/lib/ext:/usr/share/glassfish/domains/domain1/lib/ext:/usr/share/glassfish/javadb/lib -Djava.library.path=/usr/share/glassfish/lib:/usr/share/glassfish/lib:/usr/share/glassfish/lib -Djava.security.auth.login.config=/usr/share/glassfish/domains/domain1/config/login.conf -Djava.security.policy=/usr/share/glassfish/domains/domain1/config/server.policy -Djava.util.logging.manager=com.sun.enterprise.server.logging.ServerLogManager -Djavax.management.builder.initial=com.sun.enterprise.admin.server.core.jmx.AppServerMBeanServerBuilder -Djavax.net.ssl.keyStore=/usr/share/glassfish/domains/domain1/config/keystore.jks -Djavax.net.ssl.trustStore=/usr/share/glassfish/domains/domain1/config/cacerts.jks -Djdbc.drivers=org.apache.derby.jdbc.ClientDriver -Djmx.invoke.getters=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -client -XX:+UnlockDiagnosticVMOptions -XX:MaxPermSize=192m -Xmx512m -XX:NewRatio=2 -XX:+LogVMOutput -XX:LogFile=/usr/share/glassfish/domains/domain1/logs/jvm.log -cp /usr/share/glassfish/lib/jhall.jar:/usr/share/glassfish/lib/appserv-launch.jar com.s
Ich weiss, ein Monstrum :D

Kennt jemand den richtigen Trick, um den Status des System Service für Java-Applikationen richtig zu ermitteln?

Im Übrigen wird der Glassfish System Service beim Booten nicht gestartet (nur von Hand funktioniert es); möglicherweise hängt dies mit dem untauglichen Status zusammen. Wenn aber jemand einen andern Fehler sieht, bin ich sehr dankbar um den Hinweis.

Vielen Dank für Hinweise.
Mucker
 

oc2pus

Ultimate Guru
nutze dieses Script für den Status (aus meinem Paket jameica)

mit der Funktion javaps kannst du die PID ermitteln

Code:
#!/bin/sh

### BEGIN INIT INFO
# Provides:     jameica
# Required-Start:   $local_fs $remote_fs $network
# Required-Stop:    $local_fs $remote_fs $network
# Default-Start:    3 5
# Default-Stop:     0 1 2 6
# Short-Description:    Jameica Application Server
# Description:      Starts the Jameica Application Server
### END INIT INFO

# function javaps "shameless stolen" from
# Copyright (c) 2000 Alexander V. Konstantinou <akonstan@acm.org>
#
# Permission to use, copy, modify, distribute and sell this software
# and its documentation for any purpose is hereby granted without fee,
# provided that the above copyright notice appear in all copies and
# that both that copyright notice and this permission notice appear
# in supporting documentation. Alexander V. Konstantinou makes no
# representations about the suitability of this software for any
# purpose.  It is provided "as is" without express or implied warranty.
# 
# Description: prints out the java processes running on a Linux host.
#              Optional "-noflags" argument controls verbosity
#
# Requirements: Linux host with a /proc filesystem
#
# Updates: http://www.cs.columbia.edu/~akonstan/javaps
function javaps()
{
	NOFLAGS=0
	if [ -n "$1" -a "$1" = "-noflags" ]; then
		NOFLAGS=1
	fi

	echo "PID	Process"

	# For every file in the /proc file system
	FILES=`/bin/ls -1 /proc`

	for FILE in $FILES; do
		PROCESS_ID=$FILE
  		STATUS_FILE=/proc/$FILE/status
  		CMDLINE_FILE=/proc/$FILE/cmdline

  		# Check if it is a process directory and that we have read access
  		if [ -d "/proc/$FILE" -a -r $STATUS_FILE -a -r $CMDLINE_FILE -a "$FILE" != "/proc/self" ]; then
			PROCESS_NAME=`grep 'Name:' $STATUS_FILE | awk '{print $2}'`

    		# Only interested in java processes
    		if [ "$PROCESS_NAME" = "java" ]; then
      			PARENT_PID=`grep 'PPid' $STATUS_FILE | awk '{print $2}'`

      			# Figure out if process has a parent that is a java process
      			ISROOT=0
      			if [ $PARENT_PID -eq 1 ]; then
        			ISROOT=1
      			else
        			PARENT_NAME=`grep 'Name:' /proc/$PARENT_PID/status | awk '{print $2}'`
        			if [ "$PARENT_NAME" != "java" ]; then
          				ISROOT=1
        			fi
      			fi

      			# If root java process print out
      			if [ $ISROOT -ne 0 ]; then
        			PROCESS_CMDLINE="`cat $CMDLINE_FILE | tr '\000' ' '`"
					IGNORE_ARG=0
        			DESCR=
        			for ARG in $PROCESS_CMDLINE; do
          				if [ $NOFLAGS -eq 0 ]; then
             				DESCR="$DESCR $ARG"
          				else
            				if [ $IGNORE_ARG -eq 0 ]; then
              					if [ $ARG = "-classpath" -o $ARG = "-cp" ]; then
                					IGNORE_ARG=1
              					elif [ -z "`echo $ARG | grep '^-D'`" -a -z "`echo $ARG | grep '^-X'`" ]; then
                					DESCR="$DESCR $ARG"
              					fi
            					else 
             						IGNORE_ARG=0
            				fi
          				fi
        			done
        			echo "$PROCESS_ID	$DESCR"
      			fi
    		fi
  		fi
	done
}


#
# Determine the base and follow a runlevel link name.
#
base=${0##*/}
link=${base#*[SK][0-9][0-9]}

#JAVA=`which java`
#BASEDIR=`dirname $0`
WORKDIR=~/.jameica
PASSWORD=CHANGE_THIS_BEFORE_YOU_START_JAMEICA
PIDFILE=$WORKDIR/jameica.pid

### Please do not edit anything below this line! ########################
#                                                                       #

. /etc/rc.status

rc_reset

return=$rc_done
case "$1" in
	start)
		mkdir -p $WORKDIR
		echo -n "Starting Jameica "
		/usr/bin/jameicaserver.sh -n -f $WORKDIR -p $PASSWORD > /dev/null 2>&1 &
		sleep 1
		PID=`javaps -noflags | grep jameica | awk '{print $1}'`
#		echo "jameica started with PID=$PID"
		rc_status -v
		echo $PID > $PIDFILE
		;;
	stop)
		if test -e $PIDFILE ; then
			echo -n "Shutting down Jameica "
			kill `cat $PIDFILE`
			rm -f $PIDFILE
			rc_status -v
		else
			echo "Not running"
		fi
		;;
	reload|restart)
		$0 stop
		sleep 1
		$0 start
		;;
	status)
		echo -n "Checking for Jameica "
		if test -e $PIDFILE ; then
			echo " seems running"
		else
			echo " not running"
		fi
		;;
	*)
		echo "Usage: $0 {start|stop|restart|status}"
		exit 1
		;;
esac
rc_exit
 
OP
M

mucker

Newbie
Vielen Dank, oc2pus, das finde ich eine sehr innovative Art, um das Problem anzugehen. Allerdings braucht es noch eine kleine Verbesserung: im Status muss man checken, ob ein Prozess mit der PID, die man im PIDFILE gespeichert hat, wirklich noch läuft. Sonst kann der Prozess gekillt oder abgestürzt sein, und der Status gäbe immer noch 'running' zurück.

Die erforderliche Prüfung kann mit folgendem Code gemacht werden:
if test -e /proc/`cat $PIDFILE`; then rc_status -v; else rc_failed 3; rc_status -v; fi;

Ich habe das im Startfile eingearbeitet. Starten, Stoppen und Status funktionieren nun korrekt, und Glassfish wird beim Hochfahren automatisch gestartet.

Dies ist der Code, den ich nun verwende (man beachte, dass weitere Funktionen wie Reload wohl noch nicht korrekt sind - deren Sinn verschliesst sich mir aber noch):

Code:
#!/bin/sh
#
# system startup script for glassfish application/web server
#
# LSB compatible service control script; see http://www.linuxbase.org/spec/
# 
# Note: This template uses functions rc_XXX defined in /etc/rc.status on
# UnitedLinux/SUSE/Novell based Linux distributions. If you want to base your
# script on this template and ensure that it works on non UL based LSB 
# compliant Linux distributions, you either have to provide the rc.status
# functions from UL or change the script to work without them.
# See skeleton.compat for a template that works with other distros as well.
#
### BEGIN INIT INFO
# Provides:          glassfish 
# Required-Start:    $syslog $network 
# Should-Start: $time ypbind smtp
# Required-Stop:     $syslog
# Should-Stop: $time ypbind smtp
# Default-Start:     3 5
# Default-Stop:      0 1 2 6
# Short-Description: glassfish server providing application/web server function 
# Description:       Start glassfish server to provide web server functionality
### END INIT INFO
# 
# Any extensions to the keywords given above should be preceeded by 
# X-VendorTag- (X-UnitedLinux- X-SuSE- for us) according to LSB.
# 
# Notes on Required-Start/Should-Start:
# * There are two different issues that are solved by Required-Start
#    and Should-Start
# (a) Hard dependencies: This is used by the runlevel editor to determine
#     which services absolutely need to be started to make the start of
#     this service make sense. Example: nfsserver should have
#     Required-Start: $portmap
#     Also, required services are started before the dependent ones.
#     The runlevel editor will warn about such missing hard dependencies
#     and suggest enabling. During system startup, you may expect an error,
#     if the dependency is not fulfilled.
# (b) Specifying the init script ordering, not real (hard) dependencies.
#     This is needed by insserv to determine which service should be
#     started first (and at a later stage what services can be started
#     in parallel). The tag Should-Start: is used for this.
#     It tells, that if a service is available, it should be started
#     before. If not, never mind.
# * When specifying hard dependencies or ordering requirements, you can 
#   use names of services (contents of their Provides: section)
#   or pseudo names starting with a $. The following ones are available
#   according to LSB (1.1):
#	$local_fs		all local file systems are mounted
#				(most services should need this!)
#	$remote_fs		all remote file systems are mounted
#				(note that /usr may be remote, so
#				 many services should Require this!)
#	$syslog			system logging facility up
#	$network		low level networking (eth card, ...)
#	$named			hostname resolution available
#	$netdaemons		all network daemons are running
#   The $netdaemons pseudo service has been removed in LSB 1.2.
#   For now, we still offer it for backward compatibility.
#   These are new (LSB 1.2):
#	$time			the system time has been set correctly	
#	$portmap		SunRPC portmapping service available
#   UnitedLinux extensions:
#	$ALL			indicates that a script should be inserted
#				at the end
# * The services specified in the stop tags 
#   (Required-Stop/Should-Stop)
#   specify which services need to be still running when this service
#   is shut down. Often the entries there are just copies or a subset 
#   from the respective start tag.
# * Should-Start/Stop are now part of LSB as of 2.0,
#   formerly SUSE/Unitedlinux used X-UnitedLinux-Should-Start/-Stop.
#   insserv does support both variants.
# * X-UnitedLinux-Default-Enabled: yes/no is used at installation time
#   (%fillup_and_insserv macro in %post of many RPMs) to specify whether
#   a startup script should default to be enabled after installation.
#   It's not used by insserv.
#
# Note on runlevels:
# 0 - halt/poweroff 			6 - reboot
# 1 - single user			2 - multiuser without network exported
# 3 - multiuser w/ network (text mode)  5 - multiuser w/ network and X11 (xdm)
# 
# Note on script names:
# http://www.linuxbase.org/spec/refspecs/LSB_1.3.0/gLSB/gLSB/scrptnames.html
# A registry has been set up to manage the init script namespace.
# http://www.lanana.org/
# Please use the names already registered or register one or use a
# vendor prefix.

# function javaps taken from
# Copyright (c) 2000 Alexander V. Konstantinou <akonstan@acm.org>
#
# Permission to use, copy, modify, distribute and sell this software
# and its documentation for any purpose is hereby granted without fee,
# provided that the above copyright notice appear in all copies and
# that both that copyright notice and this permission notice appear
# in supporting documentation. Alexander V. Konstantinou makes no
# representations about the suitability of this software for any
# purpose.  It is provided "as is" without express or implied warranty.
#
# Description: prints out the java processes running on a Linux host.
#              Optional "-noflags" argument controls verbosity
#
# Requirements: Linux host with a /proc filesystem
#
# Updates: http://www.cs.columbia.edu/~akonstan/javaps
function javaps()
{
   NOFLAGS=0
   if [ -n "$1" -a "$1" = "-noflags" ]; then
      NOFLAGS=1
   fi

   echo "PID   Process"

   # For every file in the /proc file system
   FILES=`/bin/ls -1 /proc`

   for FILE in $FILES; do
      PROCESS_ID=$FILE
        STATUS_FILE=/proc/$FILE/status
        CMDLINE_FILE=/proc/$FILE/cmdline

        # Check if it is a process directory and that we have read access
        if [ -d "/proc/$FILE" -a -r $STATUS_FILE -a -r $CMDLINE_FILE -a "$FILE" != "/proc/self" ]; then
         PROCESS_NAME=`grep 'Name:' $STATUS_FILE | awk '{print $2}'`

          # Only interested in java processes
          if [ "$PROCESS_NAME" = "java" ]; then
               PARENT_PID=`grep 'PPid' $STATUS_FILE | awk '{print $2}'`

               # Figure out if process has a parent that is a java process
               ISROOT=0
               if [ $PARENT_PID -eq 1 ]; then
                 ISROOT=1
               else
                 PARENT_NAME=`grep 'Name:' /proc/$PARENT_PID/status | awk '{print $2}'`
                 if [ "$PARENT_NAME" != "java" ]; then
                      ISROOT=1
                 fi
               fi

               # If root java process print out
               if [ $ISROOT -ne 0 ]; then
                 PROCESS_CMDLINE="`cat $CMDLINE_FILE | tr '\000' ' '`"
                 IGNORE_ARG=0
                 DESCR=
                 for ARG in $PROCESS_CMDLINE; do
                      if [ $NOFLAGS -eq 0 ]; then
                         DESCR="$DESCR $ARG"
                      else
                        if [ $IGNORE_ARG -eq 0 ]; then
                             if [ $ARG = "-classpath" -o $ARG = "-cp" ]; then
                               IGNORE_ARG=1
                             elif [ -z "`echo $ARG | grep '^-D'`" -a -z "`echo $ARG | grep '^-X'`" ]; then
                               DESCR="$DESCR $ARG"
                             fi
                           else
                               IGNORE_ARG=0
                        fi
                      fi
                 done
                 echo "$PROCESS_ID   $DESCR"
               fi
          fi
        fi
   done
}

# Check for missing binaries (stale symlinks should not happen)
# Note: Special treatment of stop for LSB conformance

# the binary is a pseudo to enable use of code from skeleton
glassfish_BIN=/usr/share/glassfish/lib/appserv
test -x $glassfish_BIN || { echo "$glassfish_BIN not installed"; 
	if [ "$1" = "stop" ]; then exit 0;
	else exit 5; fi; }

PIDFILE=/tmp/glassfish.pid

# Check for existence of needed config file and read it
# FOO_CONFIG=/etc/sysconfig/FOO
# test -r $FOO_CONFIG || { echo "$FOO_CONFIG not existing";
#	if [ "$1" = "stop" ]; then exit 0;
#	else exit 6; fi; }

# Read config	
#. $FOO_CONFIG

# Source LSB init functions
# providing start_daemon, killproc, pidofproc, 
# log_success_msg, log_failure_msg and log_warning_msg.
# This is currently not used by UnitedLinux based distributions and
# not needed for init scripts for UnitedLinux only. If it is used,
# the functions from rc.status should not be sourced or used.
#. /lib/lsb/init-functions

# Shell functions sourced from /etc/rc.status:
#      rc_check         check and set local and overall rc status
#      rc_status        check and set local and overall rc status
#      rc_status -v     be verbose in local rc status and clear it afterwards
#      rc_status -v -r  ditto and clear both the local and overall rc status
#      rc_status -s     display "skipped" and exit with status 3
#      rc_status -u     display "unused" and exit with status 3
#      rc_failed        set local and overall rc status to failed
#      rc_failed <num>  set local and overall rc status to <num>
#      rc_reset         clear both the local and overall rc status
#      rc_exit          exit appropriate to overall rc status
#      rc_active        checks whether a service is activated by symlinks
. /etc/rc.status

# Reset status of this service
rc_reset

# Return values acc. to LSB for all commands but status:
# 0	  - success
# 1       - generic or unspecified error
# 2       - invalid or excess argument(s)
# 3       - unimplemented feature (e.g. "reload")
# 4       - user had insufficient privileges
# 5       - program is not installed
# 6       - program is not configured
# 7       - program is not running
# 8--199  - reserved (8--99 LSB, 100--149 distrib, 150--199 appl)
# 
# Note that starting an already running service, stopping
# or restarting a not-running service as well as the restart
# with force-reload (in case signaling is not supported) are
# considered a success.

case "$1" in

    start)
	echo -n "Starting glassfish... "
	/usr/share/glassfish/start_server

	# evaluate PID and write it to PIDFILE
	PID=`javaps | grep "/usr/share/glassfish" | awk '{print $1}'`
	echo "glassfish started with PID=$PID"
	rc_status -v
	echo $PID > $PIDFILE
	;;

    stop)
	echo -n "Shutting down glassfish... "
	 /usr/share/glassfish/stop_server

	if test -e $PIDFILE ; then
         rm -f $PIDFILE
	 echo "$PIDFILE removed"
	fi

	# Remember status and be verbose
	rc_status -v
	;;

    try-restart|condrestart)
	## Do a restart only if the service was active before.
	## Note: try-restart is now part of LSB (as of 1.9).
	## RH has a similar command named condrestart.
	if test "$1" = "condrestart"; then
		echo "${attn} Use try-restart ${done}(LSB)${attn} rather than condrestart ${warn}(RH)${norm}"
	fi
	$0 status
	if test $? = 0; then
		$0 restart
	else
		rc_reset	# Not running is not a failure.
	fi
	# Remember status and be quiet
	rc_status
	;;
    restart)
	## Stop the service and regardless of whether it was
	## running or not, start it again.
	$0 stop
	$0 start

	# Remember status and be quiet
	rc_status
	;;

    force-reload)
	## Signal the daemon to reload its config. Most daemons
	## do this on signal 1 (SIGHUP).
	## If it does not support it, restart the service if it
	## is running.

	echo -n "Reload service glasshfish "
        if test -e $PIDFILE; then
          PID=`cat $PIDFILE`
         # If it supports signaling:
         echo -n "Reload service glassfish "
         kill -HUP $PID;
         rc_status -v
        else
	 $0 try-restart
	 rc_status
        fi
        ;;
 
    reload)
	## Like force-reload, but if daemon does not support
	## signaling, do nothing (!)

	if test -e $PIDFILE; then
	  PID=`cat $PIDFILE`
	 # If it supports signaling:
	 echo -n "Reload service glassfish "
	 kill -HUP $PID;
	 rc_status -v
	else 
	 rc_failed 3
	  rc_status -v
	fi
	;;

    status)
	echo -n "Checking for service glassfish "
	## Check status with checkproc(8), if process is running
	## checkproc will return with exit status 0.

	# Return value is slightly different for the status command:
	# 0 - service up and running
	# 1 - service dead, but /var/run/  pid  file exists
	# 2 - service dead, but /var/lock/ lock file exists
	# 3 - service not running (unused)
	# 4 - service status unknown :-(
	# 5--199 reserved (5--99 LSB, 100--149 distro, 150--199 appl.)
	
	# NOTE: checkproc returns LSB compliant status values.
	if test -e $PIDFILE ; then
	 PID=`cat $PIDFILE`
	 if test -e /proc/$PID; then rc_status -v; else rc_failed 3; rc_status -v; fi;
	else
	 rc_failed 3; rc_status -v 
	fi 
	# NOTE: rc_status knows that we called this init script with
	# "status" option and adapts its messages accordingly.
	;;

    probe)
	## Optional: Probe for the necessity of a reload, print out the
	## argument to this init script which is required for a reload.
	## Note: probe is not (yet) part of LSB (as of 1.9)

	# test /etc/FOO/FOO.conf -nt /var/run/FOO.pid && echo reload
	;;
    *)
	echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload|probe}"
	exit 1
	;;
esac
rc_exit

Nochmals vielen Dank für die Hilfe.
Mucker
 

oc2pus

Ultimate Guru
Dies ist der Code, den ich nun verwende (man beachte, dass weitere Funktionen wie Reload wohl noch nicht korrekt sind - deren Sinn verschliesst sich mir aber noch)

RELOAD wird i.d.R für diese Scenarien verwendet:

erstes Scenario:
der daemon ist gestartet und arbeitet, nun wird die Software upgedatet ==> es muss der "alte" gestoppt werden und der neue gestartet werden ==> reload.
d.h. reload ist in fast allen Fällen einfach ein $0 stop; $0 start Aufruf.

zweites Scenario:
es wird eine Konfiguration geändert ==> reload

btw: gute Adaption der Idee und die Verbesserung mit dem PID ist natürlich erforderlich, werde ich demnächst im jameica script adaptieren :)
 
Oben