|
From: <ste...@ce...> - 2004-12-06 15:21:30
|
Leif ,
I don't understand your last post: if the shell script use path like :
PIDDIR : /usr/local/myapp/
(This is what i've done to make my wrapper work), if you change the
location or OS you have to change
your script variables. Or i make a directory tree that can be move
anywhere with relative path...
Maybe i misunderstound so i gonna try your script to see what happen.
Thanks for your answers
Bye
Leif Mortenson wrote:
> Stephane,
> Ok, this was a bug in the shell script. The pid file is created
> after the working dir is
> changed but that is not taken into account by the shell script.
>
> I have fixed this for the next release. The shell script will now
> always use fully qualified
> paths to avoid this issue. I have attached the new shell script. It
> should work for old
> versions of the Wrapper.
>
> Let me know how it works for you.
>
> Cheers,
> Leif
>
> Stéphane RIFF wrote:
>
>> The user is the same (sure).
>>
>> The directory tree is :
>> serviceroot
>> |
>> ---bin
>> | |
>> | ---wrapper
>> | |
>> | ---sh.script
>> |
>> ---conf
>> | |
>> | ---wrapper.conf
>> |
>> ---lib
>> |
>> ---logs
>>
>> In the wrapper.conf : wrapper.working.dir="../"
>> In sh.script : PIDDIR="."
>>
>> When i start the service (with user "steff"), the MYAPP.pid file is
>> in the "serviceroot" directory.
>> When i want to stop (with user "steff"), the sh.script complains that
>> "service not running". but
>> if i print $PIDFILE in the sh.script, it display : "./MYAPP.pid" :
>> seems good if the working directory
>> is really set to "serviceroot"
>>
>> Maybe i missunderstood about working dir but if someone can points me
>> to the right solution.....
>> Thanks to answerers
>>
>> Leif Mortenson wrote:
>>
>>> Stephane,
>>> My first guess here is a permission problem. Are you starting
>>> the wrapper as the same
>>> user that you are later attempting stop it with? I may have some
>>> problems there but I have
>>> not heard of any to date. Give me a little more info and I'll go
>>> back and look over the
>>> script some more.
>>>
>>> Cheers,
>>> Leif
>>>
>>> Stéphane RIFF wrote:
>>>
>>>> I have problem with the pid file :
>>>> in sh.script.in i have PIDDIR=".", the 'start ' command seems to
>>>> place pidfile in the right location.
>>>> but when i try to launch a 'stop' command the script tell me that
>>>> the daemon isn't running .
>>>>
>>>> I also echo some variable and the $PIDFILE is : "./MYAPPNAME.pid" so
>>>> i don't understand why the line : "if [ -f $PIDFILE ]" is not true
>>>>
>>>> I don't know if i'm understandable but i suspect there a problem
>>>> with the sh.script.in and the wrapper.working.dir.
>>>>
>>>> any hints are welcome
>>>> Thanks
>>>
>>>
>
>------------------------------------------------------------------------
>
>#! /bin/sh
>
>#
># Copyright (c) 1999, 2004 Tanuki Software
>#
># Java Service Wrapper sh script. Suitable for starting and stopping
># wrapped Java applications on UNIX platforms.
>#
>
>#-----------------------------------------------------------------------------
># These settings can be modified to fit the needs of your application
>
># Application
>APP_NAME="@app.name@"
>APP_LONG_NAME="@app.long.name@"
>
># Wrapper
>WRAPPER_CMD="./wrapper"
>WRAPPER_CONF="../conf/wrapper.conf"
>
># 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="."
>
># 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=
>
># The following two lines are used by the chkconfig command. Change as is
># appropriate for your application. They should remain commented.
># chkconfig: 2345 20 80
># description: @app.long.name@
>
># Do not modify anything beyond this point
>#-----------------------------------------------------------------------------
>
># Get the fully qualified path to the script
>case $0 in
> /*)
> SCRIPT="$0"
> ;;
> *)
> PWD=`pwd`
> SCRIPT="$PWD/$0"
> ;;
>esac
>
># Change spaces to ":" so the tokens can be parsed.
>SCRIPT=`echo $SCRIPT | sed -e 's; ;:;g'`
># Get the real path to this script, resolving any symbolic links
>TOKENS=`echo $SCRIPT | sed -e 's;/; ;g'`
>REALPATH=
>for C in $TOKENS; do
> REALPATH="$REALPATH/$C"
> while [ -h "$REALPATH" ] ; do
> LS="`ls -ld "$REALPATH"`"
> LINK="`expr "$LS" : '.*-> \(.*\)$'`"
> if expr "$LINK" : '/.*' > /dev/null; then
> REALPATH="$LINK"
> else
> REALPATH="`dirname "$REALPATH"`""/$LINK"
> fi
> done
>done
># Change ":" chars back to spaces.
>REALPATH=`echo $REALPATH | sed -e 's;:; ;g'`
>
># Change the current directory to the location of the script
>cd "`dirname "$REALPATH"`"
>REALDIR=`pwd`
>
># If the PIDDIR is relative, set its value relative to the full REALPATH to avoid problems if
># the working directory is later changed.
>FIRST_CHAR=`echo $PIDDIR | cut -c1,1`
>if [ "$FIRST_CHAR" != "/" ]
>then
> PIDDIR=$REALDIR/$PIDDIR
>fi
># Same test for WRAPPER_CONF
>FIRST_CHAR=`echo $WRAPPER_CONF | cut -c1,1`
>if [ "$FIRST_CHAR" != "/" ]
>then
> WRAPPER_CONF=$REALDIR/$WRAPPER_CONF
>fi
>
># 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 message along with the location of the command 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
> # Resolve the location of the 'id' command
> IDEXE="/usr/xpg4/bin/id"
> if [ ! -x $IDEXE ]
> then
> IDEXE="/usr/bin/id"
> if [ ! -x $IDEXE ]
> then
> echo "Unable to locate 'id'."
> echo "Please report this message along with the location of the command on your system."
> exit 1
> fi
> fi
>
> if [ "`$IDEXE -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 -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 -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 wrapper.pidfile=$PIDFILE
> else
> exec $CMDNICE $WRAPPER_CMD $WRAPPER_CONF wrapper.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 wrapper.pidfile=$PIDFILE wrapper.daemonize=TRUE
> else
> su -m $RUN_AS_USER -c "exec $CMDNICE $WRAPPER_CMD $WRAPPER_CONF wrapper.pidfile=$PIDFILE wrapper.daemonize=TRUE"
> fi
> else
> if [ "X$RUN_AS_USER" = "X" ]
> then
> exec $CMDNICE $WRAPPER_CMD $WRAPPER_CONF wrapper.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 wrapper.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
>
>
|