[openrtm-commit:00176] r2184 - trunk/OpenRTM-aist/utils/rtm-naming
openrtm @ openrtm.org
openrtm @ openrtm.org
2011年 6月 16日 (木) 08:01:33 JST
Author: n-ando
Date: 2011-06-16 08:01:33 +0900 (Thu, 16 Jun 2011)
New Revision: 2184
Modified:
trunk/OpenRTM-aist/utils/rtm-naming/rtm-naming.in
Log:
- If the existing naming service (NS) is started by /etc/init.d script
the script asks if the process is stopped by the script with sudo.
- If the NS is not started by /etc/init.d script, it asks if the
process is terminated forcibly by pkill.
- After existing NS is terminated, new NS will be started.
Modified: trunk/OpenRTM-aist/utils/rtm-naming/rtm-naming.in
===================================================================
--- trunk/OpenRTM-aist/utils/rtm-naming/rtm-naming.in 2011-06-15 03:11:02 UTC (rev 2183)
+++ trunk/OpenRTM-aist/utils/rtm-naming/rtm-naming.in 2011-06-15 23:01:33 UTC (rev 2184)
@@ -4,8 +4,7 @@
# @date $Date: 2005-05-12 09:06:19 $
# @author Noriaki Ando <n-ando at aist.go.jp>
#
-# Copyright (C) 2003-2005
-# Task-intelligence Research Group,
+# Copyright (C) 2003-2011
# Intelligent Systems Research Institute,
# National Institute of
# Advanced Industrial Science and Technology (AIST), Japan
@@ -14,10 +13,11 @@
# $Id$
#
+pname=`basename $cosnames`
hostname=`hostname`
currdir=`pwd`
+DEBUG=""
-
usage()
{
cat<<EOF
@@ -25,28 +25,301 @@
EOF
}
-omniname()
+
+#
+# debug <text>
+#
+# Debug print. If variable "DEBUG" is defined, text will be printed.
+#
+# @param text to be printed.
+#
+debug()
{
- if test -f $cosnames ; then
- rm -f ./omninames-$hostname.log
- rm -f ./omninames-$hostname.bak
- echo 'Starting omniORB omniNames: '$hostname':'$port
- $cosnames -start $port -logdir $currdir &
+ if test "x$DEBUG" != "x"; then
+ echo $*
+ fi
+}
+#
+# get_pid_of_nsport <port_number>
+#
+# @param pid_of_nsport: Process ID of a process which is using the port.
+# @param pname_of_nsport: Process name which is using the port is set
+# @param pid_of_nsport: Process ID which is using the port is set
+# @return 0 process that is using the port was found
+# 1 process not found
+#
+#
+get_pid_of_nsport()
+{
+ _port=$1
+ debug "netstat -tanp 2> /dev/null | grep $_port | awk '{print $7;}'"
+ netstat_tanp=`netstat -tanp`
+ _netstat=`netstat -tanp 2> /dev/null | grep $_port | awk '{if($7!="-"){print $7;}}'`
+ debug "A possible process that is using $port port:" $_netstat
+ if test "x$_netstat" = "x"; then
+ debug "No process using port number ${_port} on the system."
+ return 1
+ fi
+ if test "x$_netstat" = "x"; then
+ debug "Process information could not be identified."
+ return 1
+ fi
+
+ _pid=`echo $_netstat | awk 'BEGIN{FS="/";}{print $1;}'`
+ pname_of_nsport=`echo $_netstat | awk 'BEGIN{FS="/";}{print $2;}'`
+ pid_of_nsport=$_pid
+ debug "$_port port is used by $pname_of_nsport (pid = $_pid)."
+ return 0
+}
+
+
+#
+# is_launch_from_init <prog_name> (<pid>)
+#
+# @param prog_name The name of the program
+# @param pid The pid of the program
+# @param init_script A path to init script is set
+# @return 0: The program might be started from init script
+# 1: The program might not be started from init script
+#
+is_started_from_init()
+{
+ debug "number of args" $#
+ if test $# -eq 2; then
+ _pname=$1
+ _pid=$2
+ elif test $# -eq 1; then
+ debug "pid is not specified. It is obtained from pid file."
+ _pname=$1
+ _pid=`cat /var/run/$_pname.pid`
+ elif test $# -eq 0; then
+ debug "No program name specified."
+ fi
+
+ if test -f /var/run/$_pname.pid; then
+ debug "pid file: /var/run/$_pname.pid found"
+ _var_run_pid=`cat /var/run/$_pname.pid`
+
+ debug "specified pid: " $_pid
+ debug "/var/run/$_pname.pid: " $_var_run_pid
+
+ if test $_pid -eq $_var_run_pid; then
+ debug "The process $_pname ($_pid) might be started " \
+ "from init script."
+ debug "searching init script: $cosnames"
+ init_script=`grep $cosnames /etc/init.d/* | awk 'BEGIN{FS=":";}{if(FNR==1){print $1;}}'`
+
+ if test "x$init_script" = "x"; then
+
+ echo "Init script not found. Aborting"
+ exit 1
+ fi
+ debug "Init script found: $init_script"
+ return 0
fi
+
+ debug "The process $_pname ($_pid) might not be started " \
+ "from init script."
+ return 1
+ fi
+ debug "/var/run/$_pname.pid not found."
+ return 1
}
-taonames()
+
+#
+# check_cosname
+#
+# Checking if global variable "cosname" is set.
+#
+check_cosname()
{
- if test -f $cosnames ; then
- echo 'Starting TAO Naming_Service: '$hostname':'$port
- $cosnames -ORBEndPoint iiop://$hostname:$port &
+ if test ! -f $cosnames ; then
+ echo "Name service program ($cosnames) not found."
+ echo "Please install or chech rtm-naming script."
+ exit 1
+ fi
+}
+
+
+#
+# stop_existing_ns
+#
+# This function try to stop existing nameing service.
+#
+# 1. It tries to find a process which is using specified port. If the
+# process is not same as naming-service to be started by this
+# script, script will be aborted.
+#
+# 2. Next, it checks if the process is started from init script. If
+# the process is started from the init script, it tries to stop it
+# by the script.
+#
+# 3. The process is not started by init script, it tries to stop the
+# process by pkill command.
+#
+stop_existing_ns()
+{
+ get_pid_of_nsport $port
+ if test $? -eq 0; then
+ debug "The Process information using the port could be obtained."
+ # If "port" is used by other program -> abort
+
+ pids=`pgrep $pname`
+ matchflag=0
+ for p in $pids; do
+ if test "x$pid_of_nsport" = "x$p"; then
+ matchflag=1
+ fi
+ done
+ if test $matchflag -eq 0; then
+ echo "$pname_of_nsport (not $pname) is using the port."
+ echo "Starting $pname aborted. Please use the other port."
+ exit 1
fi
+ else
+ debug "The process information using the port could not be obtained."
+ pname_of_nsport=$pname
+ pid_of_nsport=`pgrep $pname`
+ fi
+
+
+ is_started_from_init $pname_of_nsport $pid_of_nsport
+
+ # omniNames is not started by init script
+ if test $? -ne 0; then
+ debug "$pname might not be started from init script."
+ if test "x$pid_of_nsport" != "x" ; then
+ echo "$pname (pid: $pid_of_nsport) is running"
+ read -p "Kill anyway and start $pname again? (y/N)" killns
+ if test "x$killns" = "xy" -o "x$killns" = "xY"; then
+ pkill -f $pname
+ echo "$pname (pid: $pid_of_nsport) are killed"
+ return 0
+ fi
+ echo "Aborting"
+ exit 1
+ fi
+ echo "No running $pname found. The process using the port $port "
+ echo "cannot be estimated. Arboting"
+ exit 1
+ fi
+
+ # omniNames is started by init script
+ echo "omniNames might be started $init_script."
+ echo "Stop it (password for sudo is required.)"
+ read -p "and start omniNames by rtm-naming? (y/N)" startns
+
+ if test "x$startns" != "xy" -a "x$startns" != "xY" ; then
+ echo "Aborted."
+ exit 1
+ fi
+ echo "Stopping omniNames by $init_script."
+ sudo $init_script stop
+ return 0
}
+#------------------------------------------------------------
+# omniNames specific functions
+#------------------------------------------------------------
+#
+# start_omninames
+#
+# This function starts omniNames and checks it is properly started.
+# If omniNames could not be started properly, this function returns 1.
+#
+start_omninames()
+{
+ echo 'Starting omniORB omniNames: '$hostname':'$port
+ rm -f ./omninames-$hostname.log
+ rm -f ./omninames-$hostname.bak
+ $cosnames -start $port -logdir $currdir &
+ ret=$!
+ sleep 1
+ debug "return code of omniNames:" $ret
+ omnip=`ps $! | wc -l`
+ if test $omnip -gt 1; then
+ echo "omniNames properly started"
+ exit 0
+ fi
+ return 1
+}
-port=$1
+omniname()
+{
+ # Check cosname variable is properly set
+ check_cosname
+ # Starting omniNames
+ start_omninames
+ echo "omniNames was not properly started."
+
+ # Stopping existing name service
+ stop_existing_ns
+
+ # Try to start omniNames again
+ start_omninames
+ echo "omniNames was not properly started."
+}
+
+#------------------------------------------------------------
+# TAO Naming_Service specific functions
+#------------------------------------------------------------
+#
+# start_taonames
+#
+# This function starts TAO Naming_Service and checks it is properly started.
+# If TAO Naming_Service could not be started properly, this function returns 1.
+#
+start_taonames()
+{
+ if test ! -f $cosnames ; then
+ echo "TAO Naming_Service not found. Aborting."
+ exit 1
+ fi
+ echo 'Starting TAO Naming_Service: '$hostname':'$port
+ $cosnames -m 0 -ORBListenEndpoints iiop://:$port &
+ ret=$!
+ sleep 1
+ debug "return code of TAO Naming_Service:" $ret
+ omnip=`ps $! | wc -l`
+ if test $omnip -gt 1; then
+ echo "TAO Naming_Service properly started"
+ exit 0
+ fi
+ return 1
+
+}
+
+taonames()
+{
+ # Check cosname variable is properly set
+ check_cosname
+
+ # Starting omniNames
+ start_taonames
+ echo "TAO Naming_Service was not properly started."
+
+ # Stopping existing name service
+ stop_existing_ns
+
+ # Try to start omniNames again
+ start_taonames
+ echo "TAO Naming_Service was not properly started."
+}
+
+
+
+#------------------------------------------------------------
+# main
+#------------------------------------------------------------
+if test $# -gt 0; then
+ port=$1
+else
+ port=2809
+fi
+
case $orb in
omniORB)
omniname
openrtm-commit メーリングリストの案内