#! /bin/sh # # Skeleton sh script suitable for starting and stopping # "wrapped" Java apps. # # Make sure that PIDFILE points to the correct location, # if you have changed the default location set in the # wrapper configuration file. # # Note that the wrapper only supports Windows, Mac, and # certain Linux architectures. If this script fails to # successfully invoke i2psvc on your platform, # try the runplain.sh script instead. # #----------------------------------------------------------------------------- # These settings can be modified to fit the needs of your application # Paths # Note that (percent)INSTALL_PATH and (percent)SYSTEM_java_io_tmpdir # should have been replaced by the izpack installer. # If you did not run the installer, replace them with the appropriate path. I2P="%INSTALL_PATH" I2PTEMP="%SYSTEM_java_io_tmpdir" # PORTABLE installation: # Use the following instead. #I2PTEMP="%INSTALL_PATH" # Application APP_NAME="i2p" APP_LONG_NAME="I2P Service" # Wrapper WRAPPER_CMD="$I2P/i2psvc" WRAPPER_CONF="$I2P/wrapper.config" # Priority at which to run the wrapper. See "man nice" for valid priorities. # nice is only used if a priority is specified. PRIORITY= # Location of the pid file. PIDDIR="$I2PTEMP" # If uncommented, causes the Wrapper to be shutdown using an anchor file. # When launched with the 'start' command, it will also ignore all INT and # TERM signals. #IGNORE_SIGNALS=true # If specified, the Wrapper will be run as the specified user when the 'start' # command is passed to this script. When running with the 'console' command # the current user will be used. # IMPORTANT - Make sure that the user has the required privileges to write # the PID file and wrapper.log files. Failure to be able to write the log # file will cause the Wrapper to exit without any way to write out an error # message. # NOTE - This will set the user which is used to run the Wrapper as well as # the JVM and is not useful in situations where a privileged resource or # port needs to be allocated prior to the user being changed. #RUN_AS_USER= # Do not modify anything beyond this point #----------------------------------------------------------------------------- # Process ID ANCHORFILE="$PIDDIR/$APP_NAME.anchor" PIDFILE="$PIDDIR/$APP_NAME.pid" pid="" # Resolve the location of the 'ps' command PSEXE="/usr/bin/ps" if [ ! -x $PSEXE ] then PSEXE="/bin/ps" if [ ! -x $PSEXE ] then echo "Unable to locate 'ps'." echo "Please report this with the location on your system." exit 1 fi fi # Build the nice clause if [ "X$PRIORITY" = "X" ] then CMDNICE="" else CMDNICE="nice -$PRIORITY" fi # Check the configured user if [ "X$RUN_AS_USER" != "X" ] then if [ "`id -u -n`" = "$RUN_AS_USER" ] then # Already running as the configured user. Avoid password prompts by not calling su. RUN_AS_USER="" fi fi getpid() { if [ -f $PIDFILE ] then if [ -r $PIDFILE ] then pid=`cat $PIDFILE` if [ "X$pid" != "X" ] then # Verify that a process with this pid is still running. pid=`$PSEXE -p $pid | grep $pid | grep -v grep | awk '{print $1}' | tail -n 1` if [ "X$pid" = "X" ] then # This is a stale pid file. rm -f $PIDFILE echo "Removed stale pid file: $PIDFILE" fi fi else echo "Cannot read $PIDFILE." exit 1 fi fi } testpid() { pid=`$PSEXE -p $pid | grep $pid | grep -v grep | awk '{print $1}' | tail -n 1` if [ "X$pid" = "X" ] then # Process is gone so remove the pid file. rm -f $PIDFILE fi } console() { echo "Running $APP_LONG_NAME..." getpid if [ "X$pid" = "X" ] then if [ "X$IGNORE_SIGNALS" = "X" ] then exec $CMDNICE $WRAPPER_CMD $WRAPPER_CONF i2psvc.pidfile=$PIDFILE else exec $CMDNICE $WRAPPER_CMD $WRAPPER_CONF i2psvc.pidfile=$PIDFILE wrapper.anchorfile=$ANCHORFILE fi else echo "$APP_LONG_NAME is already running." exit 1 fi } start() { echo "Starting $APP_LONG_NAME..." getpid if [ "X$pid" = "X" ] then if [ "X$IGNORE_SIGNALS" = "X" ] then if [ "X$RUN_AS_USER" = "X" ] then exec $CMDNICE $WRAPPER_CMD $WRAPPER_CONF i2psvc.pidfile=$PIDFILE wrapper.daemonize=TRUE else su -m $RUN_AS_USER -c "exec $CMDNICE $WRAPPER_CMD $WRAPPER_CONF i2psvc.pidfile=$PIDFILE wrapper.daemonize=TRUE" fi else if [ "X$RUN_AS_USER" = "X" ] then exec $CMDNICE $WRAPPER_CMD $WRAPPER_CONF i2psvc.pidfile=$PIDFILE wrapper.anchorfile=$ANCHORFILE wrapper.ignore_signals=TRUE wrapper.daemonize=TRUE else su -m $RUN_AS_USER -c "exec $CMDNICE $WRAPPER_CMD $WRAPPER_CONF i2psvc.pidfile=$PIDFILE wrapper.anchorfile=$ANCHORFILE wrapper.ignore_signals=TRUE wrapper.daemonize=TRUE" fi fi else echo "$APP_LONG_NAME is already running." exit 1 fi } stopit() { echo "Stopping $APP_LONG_NAME..." getpid if [ "X$pid" = "X" ] then echo "$APP_LONG_NAME was not running." else if [ "X$IGNORE_SIGNALS" = "X" ] then # Running so try to stop it. kill $pid if [ $? -ne 0 ] then # An explanation for the failure should have been given echo "Unable to stop $APP_LONG_NAME." exit 1 fi else rm -f $ANCHORFILE if [ -f $ANCHORFILE ] then # An explanation for the failure should have been given echo "Unable to stop $APP_LONG_NAME." exit 1 fi fi # We can not predict how long it will take for the wrapper to # actually stop as it depends on settings in wrapper.conf. # Loop until it does. savepid=$pid CNT=0 TOTCNT=0 while [ "X$pid" != "X" ] do # Loop for up to 5 minutes if [ "$TOTCNT" -lt "300" ] then if [ "$CNT" -lt "5" ] then CNT=`expr $CNT + 1` else echo "Waiting for $APP_LONG_NAME to exit..." CNT=0 fi TOTCNT=`expr $TOTCNT + 1` sleep 1 testpid else pid= fi done pid=$savepid testpid if [ "X$pid" != "X" ] then echo "Timed out waiting for $APP_LONG_NAME to exit." echo " Attempting a forced exit..." kill -9 $pid fi pid=$savepid testpid if [ "X$pid" != "X" ] then echo "Failed to stop $APP_LONG_NAME." exit 1 else echo "Stopped $APP_LONG_NAME." fi fi } status() { getpid if [ "X$pid" = "X" ] then echo "$APP_LONG_NAME is not running." exit 1 else echo "$APP_LONG_NAME is running ($pid)." exit 0 fi } dump() { echo "Dumping $APP_LONG_NAME..." getpid if [ "X$pid" = "X" ] then echo "$APP_LONG_NAME was not running." else kill -3 $pid if [ $? -ne 0 ] then echo "Failed to dump $APP_LONG_NAME." exit 1 else echo "Dumped $APP_LONG_NAME." fi fi } case "$1" in 'console') console ;; 'start') start ;; 'stop') stopit ;; 'restart') stopit start ;; 'status') status ;; 'dump') dump ;; *) echo "Usage: $0 { console | start | stop | restart | status | dump }" exit 1 ;; esac exit 0