|
From: Leif M. <le...@ta...> - 2004-12-07 00:03:52
|
Stephane,
I have not been able to test this new script anywhere other than
linux at this point. It
may have problems on other platforms still. What platform are you
running on?
In answer to your first question. It should still work on any
directory layout. The
script builds a fully qualified path by looking at the location of the
script and then
modifying the PIDDIR variable so that it is absolute. Take a look at
the following:
REALDIR=`pwd`
FIRST_CHAR=`echo $PIDDIR | cut -c1,1`
if [ "$FIRST_CHAR" != "/" ]
then
PIDDIR=$REALDIR/$PIDDIR
fi
That and a similar section for the location of the configuration
file are the only
changes. The error you are getting is most likely being caused by this
code.
You may also be having problems with the line feeds of the script.
Make sure
that is correct after you copied the script from my last mail.
Cheers,
Leif
Stéphane RIFF wrote:
> Leif ,
> Sorry for all those posts but when i try to launch the daemon with
> your new script
> the shell complain about : "bad interpreter ........."
> So i can't test it , i'm waiting to see what you think about my last post
>
> Big thanks
>
> Stéphane RIFF wrote:
>
>> 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
>>>
>>
|