* Recognize same base and config dir in WorkingDir * Reformat XInfoPanel in installer for clarity
315 lines
7.8 KiB
Bash
315 lines
7.8 KiB
Bash
#! /bin/sh
|
|
|
|
#
|
|
# Skeleton sh script suitable for starting and stopping
|
|
# wrapped Java apps on the Solaris platform.
|
|
#
|
|
# Make sure that PIDFILE points to the correct location,
|
|
# if you have changed the default location set in the
|
|
# wrapper configuration file.
|
|
#
|
|
|
|
#-----------------------------------------------------------------------------
|
|
# 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
|