|
From: <nic...@uk...> - 2004-12-13 00:00:02
|
Thanks Leif.
Sorry for the delay in reply - been busy. And I needed a weekend to
experiment with the live server...
That patch you gave me helped qite a bit.
With a couple of changes :
(I will include my whole script as an attachment - but here are the
itemised changes)
# REALDIR=`pwd`
REALDIR=`dirname "$REALPATH"`
(This avoids symlinking problems)
I added an extra test/modification for WRAPPER_CMD
# Same test for WRAPPER_CMD
FIRST_CHAR=`echo $WRAPPER_CMD | cut -c1,1`
if [ "$FIRST_CHAR" != "/" ]
then
WRAPPER_CMD=$REALDIR/$WRAPPER_CMD
fi
Also, to keep my wrapper.conf the same on windows and linux, I had to add
the following change
# Change the current directory to the location of the script
#cd "`dirname "$REALPATH"`"
cd "`dirname "$WRAPPER_CMD"`"
(and obviously I had to move this line to *after* the relative-dir checks
due to dependancy on $WRAPPER_CMD)
>> "/". This assumes the
>> root on both platforms. (Is that really what you want in UNIX??)
Sorry, I mislead you... by {root} I meant root of application rather than
"/root"
{root} means {path-to-app}
>> I am debating modifying the UNIX version of the Wrapper
>> so that it starts with forcing the working directory to the
>> location of the binary as is done on Windows.
You will still need these changes to the scripts.
Perhaps my "cd" change wont be required though....
IMO it would be excellent if the windows and unix platforms behaved the
same.
It would mean we have the same behaviour (and hence the same wrapper.conf)
regardless of target OS.
This is ideal if you are
a) developing on different os than target
b) you want to ship a product that uses wrapper.
>> It would be an incompatibility, but it would clean things up in the
>> long run...
What would the incompatibility be with?
Do you mean break in backward compatibility?
-Nick
(See attached file: Fishy.sh)
Internet
le...@ta...@lists.sourceforge.net - 06/12/2004 09:50
Please respond to wra...@li...
Sent by: wra...@li...
To: wrapper-user
cc:
Subject: Re: [Wrapper-user] working dir on windows and unix
Nick,
You stumbled onto a bug in the shell script. The problem is that
the paths to the wrapper
conf and pid files are relative. The shell script is expecting them to
be relative to the location
of the shell script, and thus home directory. After changing the
working directory, this is no
longer true.
I am still working on cleaning this up for the next release.
I have attached a shell script which will use fully qualified paths
for the locations of the
pid files and config file. The script assumes that the sh is in the
same directory as the
Wrapper binary.
In your case you are putting the shell in the root so you will need
to do a little more
work Change the value of the WRAPPER_CONF and PIDDIR variables in the
script
to appropriate values.
Then when you launch the Wrapper, rather than placing the
wrapper.working.dir
property in the wrapper.conf, either pass it in as a parameter.
"../../" for Windows
or "." for UNIX.
Another option is to leave it in the conf file, but use the value
"/". This assumes the
root on both platforms. (Is that really what you want in UNIX??)
I would appreciate your feedback on this and will try to get it
cleaned up for the
next release. I am debating modifying the UNIX version of the Wrapper
so that
it starts with forcing the working directory to the location of the
binary as is done
on Windows. It would be an incompatibility, but it would clean things
up in the
long run...
Cheers,
Leif
nic...@uk... wrote:
>Hi,
>
>I am trying to get my app working under windows and linux with the same
>config & behaviour
>
>My dir structure looks like this
>{root}/MyApp.sh
>{root}/MyApp.bat
>{root}/wrapper/bin
>{root}/wrapper/conf
>{root}/wrapper/lib
>
>1) I want my scripts are outside of bin - {root}
>2) I want my running dir is outside of bin - {root}
>
>I have modified the scripts to find the wrapper(.exe) binary & config from
>where they are.
>I have set the wrapper.working.dir property to ../../ - in order to make
it
>run in the {root} dir.
>On windows my config works fine. If I leave the unmodified scripts in the
>{root}/wrapper/bin everything works fine also.
>
>But on linux, the problem I have is that the wrapper binary doesnt start
in
>./wrapper/bin - and hence ../../ doesnt make sense - and all paths in the
>wrapper.conf are off.
>What I am struggling with is how to modify the script so that it runs the
>wrapper binary in the {root}/wrapper/bin dir rather than the current dir.
>
>Thanks.
>
>-Nick
>
>
#! /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
This message and any attachments (the "message") is
intended solely for the addressees and is confidential.
If you receive this message in error, please delete it and
immediately notify the sender. Any use not in accord with
its purpose, any dissemination or disclosure, either whole
or partial, is prohibited except formal approval. The internet
can not guarantee the integrity of this message.
BNP PARIBAS (and its subsidiaries) shall (will) not
therefore be liable for the message if modified.
**********************************************************************************************
BNP Paribas Private Bank London Branch is authorised
by CECEI & AMF and is regulated by the Financial Services
Authority for the conduct of its investment business in the
United Kingdom.
BNP Paribas Securities Services London Branch is authorised
by CECEI & AMF and is regulated by the Financial Services
Authority for the conduct of its investment business in the
United Kingdom.
BNP Paribas Fund Services UK Limited is authorised and
regulated by the Financial Services Authority.
|