forked from Mirrors/freeswitch
272 lines
5.4 KiB
Bash
Executable File
272 lines
5.4 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# unimrcp-server This shell script takes care of starting and stopping the UniMRCP server.
|
|
#
|
|
# chkconfig: 2345 65 35
|
|
# description: UniMRCP is an open source MRCP v1 & v2 server
|
|
|
|
# Some global variables
|
|
|
|
# Application
|
|
APP_NAME="unimrcpserver"
|
|
APP_LONG_NAME="unimrcpserver"
|
|
UNIMRCP_DIR="/usr/local/unimrcp/"
|
|
|
|
EXEC="${UNIMRCP_DIR}bin/${APP_NAME} -d -o 2 -r ${UNIMRCP_DIR}"
|
|
|
|
# sudo user
|
|
USERNAME=root
|
|
|
|
# Priority at which to run the server. See "man nice" for valid priorities.
|
|
# nice is only used if a priority is specified.
|
|
PRIORITY=
|
|
|
|
# Location of the pid file.
|
|
PIDDIR="/var/run/"
|
|
pid=
|
|
|
|
LOG="/var/log/${APP_NAME}.log"
|
|
|
|
if [ -e $PIDDIR ]; then
|
|
echo
|
|
else
|
|
mkdir $PIDDIR
|
|
fi
|
|
|
|
# Allow configuration overrides in /etc/sysconfig/$APP_NAME
|
|
CONFIGFILE=/etc/sysconfig/$APP_NAME
|
|
|
|
[ -x $CONFIGFILE ] && . $CONFIGFILE
|
|
|
|
# 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"`"
|
|
|
|
chown $USERNAME $PIDDIR
|
|
|
|
# Process ID
|
|
PIDFILE="$PIDDIR/$APP_NAME.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
|
|
|
|
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
|
|
exec sudo -u $USERNAME $CMDNICE $EXEC
|
|
else
|
|
echo "$APP_LONG_NAME is already running."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
start() {
|
|
echo "Starting $APP_LONG_NAME..."
|
|
getpid
|
|
if [ "X$pid" = "X" ]
|
|
then
|
|
sudo -u $USERNAME $CMDNICE $EXEC
|
|
pid=`$PSEXE -C $APP_NAME -o pid=`
|
|
echo $pid
|
|
echo $pid > $PIDFILE
|
|
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
|
|
# Running so try to stop it.
|
|
sudo -u $USERNAME 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
|
|
|
|
# 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
|
|
}
|
|
|
|
case "$1" in
|
|
|
|
'console')
|
|
console
|
|
;;
|
|
|
|
'start')
|
|
start
|
|
;;
|
|
|
|
'stop')
|
|
stopit
|
|
;;
|
|
|
|
'restart')
|
|
stopit
|
|
start
|
|
;;
|
|
|
|
'status')
|
|
status
|
|
;;
|
|
|
|
*)
|
|
echo "Usage: $0 { console | start | stop | restart | status }"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
exit 0
|
|
|