On Thu, 23 Dec 2004, Dimitris Zilaskos wrote:
> Gonzalo Merino wrote:
>
> > Hello,
> >
> > At PIC we are also experiencing this: globus-mds crashes in the CE with
> > no apparent reason and there is no message logged anywhere, apparently.
> > We started seeing this since we upgraded to 2_3_0, two days ago.
> > The globus-mds process seems to be crashing several times a day... so I
> > have also implemented now a cron job that checks if the process is there
> > and,
> > if not, it restarts the service.
> >
> > Did anyone of you discovered anything more on this issue?
> >
>
> Despite all the modifications I made to the mds init scripts I have not
> managed to obtain a core file.
I have attached "globus-mds.debug" to replace /etc/init.d/globus-mds.
It saves "strace" output for the "slapd" processes in files
/tmp/slapd-YYMMDD-HHMMSS-$$.txt. This would allow us to see if the
main thread received any fatal signal or did an exit() by itself.
#!/bin/bash
#
# Init file for the Globus Information System MDS
#
# Author: Anders Waananen <[log in to unmask]>
#
# chkconfig: 2345 55 25
# description: Globus mds
#
# processname: globus-mds
# config: /etc/sysconfig/globus
# config: /etc/globus.conf
# pidfile: /var/run/globus-mds.pid
# source function library
. /etc/rc.d/init.d/functions
############### Standard Globus configuration ######################
GLOBUS_SYSCONFIG=${GLOBUS_SYSCONFIG:-/etc/sysconfig/globus}
if [ -f "$GLOBUS_SYSCONFIG" ]; then
. "$GLOBUS_SYSCONFIG"
fi
GLOBUS_LOCATION=${GLOBUS_LOCATION:-/opt/globus}
if [ ! -d "$GLOBUS_LOCATION" ]; then
echo "GLOBUS_LOCATION not found"
exit 1
fi
export GLOBUS_LOCATION
GRID_FUNCTIONS=${GRID_FUNCTIONS:-/etc/rc.d/init.d/grid-functions}
if [ ! -r "$GRID_FUNCTIONS" ]; then
echo "grid functions ($GRID_FUNCTIONS) not available"
exit 1
fi
. $GRID_FUNCTIONS
GLOBUS_CONFIG=${GLOBUS_CONFIG:-/etc/globus.conf}
if [ ! -r "$GLOBUS_CONFIG" ]; then
echo "Globus configuration not found (usually /etc/globus.conf)"
fi
######################################################################
function debug_echo () {
if test $debug_level -gt 0; then
echo " $*" 1>&2
fi
}
function do_exit () {
conf_close
exit $*
}
RETVAL=0
conf_init
conf_open $GLOBUS_CONFIG
overwrite_config=yes
oldconfsuffix=".oldconfig"
globus_etc_location=${globus_etc_location:-$GLOBUS_ETC_LOCATION}
globus_etc_location=${globus_etc_location:-$GLOBUS_LOCATION/etc}
debug_level=${debug_level:-0}
conf_read common
if ! conf_match mds; then
echo Missing MDS configuration 2>&1
do_exit 1
fi
GLOBUS_VERSION=""
if test -f $GLOBUS_LOCATION/sbin/grid-info-soft-register ; then
if grep -q bindmethod $GLOBUS_LOCATION/sbin/grid-info-soft-register ; then
GLOBUS_VERSION=2.2
else
GLOBUS_VERSION=2.0
fi
fi
if test "x$GLOBUS_VERSION" = "x"; then
echo "Can't find GLOBUS version - is MDS installed in ${GLOBUS_LOCATION}?"
do_exit 1
fi
prog=globus-mds
# Overall defaults
GRID_INFO_PORT=${GRID_INFO_PORT:-2135}
argsfile=$GLOBUS_LOCATION/var/resourceslapd.args
# USER not defined at boot time; set root as default.
USER=${USER:-root}
user=${user:-$USER}
provider_path="$GLOBUS_LOCATION/libexec"
logfile=""
pid_file=""
lockfile=""
# Override defaults from configuration file
conf_read mds
# USER not defined at boot time; set root as default.
USER=${USER:-root}
user=${user:-$USER}
if test "x$user" = "xroot" ; then
test "x$logfile" = "x" && logfile=/var/log/globus-mds.log
#pid_file=${pid_file:-/var/run/$prog.pid}
test "x$pid_file" = "x" && pid_file=$GLOBUS_LOCATION/var/resourceslapd.pid
test "x$lockfile" = "x" && lockfile=/var/lock/subsys/$prog
else
test "x$logfile" = "x" && logfile=/var/tmp/${user}-$prog.log
test "x$pid_file" = "x" && pid_file=/var/tmp/${user}-$prog.pid
test "x$lockfile" = "x" && lockfile=/var/tmp/${user}-$prog.lock
fi
function std-header()
{
debug_echo "Creating file: $1"
echo '# This file was automatically generated by globus-mds startup script. Do not modify.' > $1
echo >> $1
}
function printregldif () {
if test "x$1" = "x" ; then
echo "Please specify a gris or a giis"
do_exit 1
fi
type=`echo $1 | tr '[:lower:]' '[:upper:]'`
cat <<-EOF
# $type Registration "$rootdn" -> $regname
dn: Mds-Vo-Op-name=register, Mds-Vo-name=$regname, o=grid
regtype: mdsreg2
reghn: $reghn
regport: $regport
regperiod: $regperiod
type: ldap
hn: $GLOBUS_HOSTNAME
port: $port
rootdn: $rootdn
ttl: $ttl
timeout: $timeout
mode: cachedump
cachettl: $cachettl
EOF
if test "x$GLOBUS_VERSION" = "x2.2" ; then
cat <<-EOF
bindmethod: $bindmethod
EOF
fi
}
# sizelimit: $sizelimit
start()
{
echo -n "Starting Globus MDS"
if test $debug_level -gt 0 ; then
echo
fi
debug_echo "Using sysconfig: $GLOBUS_SYSCONFIG"
debug_echo "Using GLOBUS_LOCATION: $GLOBUS_LOCATION"
debug_echo "Using grid-functions: $GRID_FUNCTIONS"
debug_echo "Using configuration file: $GLOBUS_CONFIG"
if [ -z "$GLOBUS_HOSTNAME" ]; then
if [ -x ${GLOBUS_LOCATION}/bin/globus-hostname ]; then
GLOBUS_HOSTNAME=`${GLOBUS_LOCATION}/bin/globus-hostname`
else
echo
echo "Missing ${GLOBUS_LOCATION}/bin/globus-hostname - Is globus_common_config installed?"
do_exit 1
fi
fi
# overwrite_config
if test "x$overwrite_config" = "xyes" ; then
debug_echo "overwrite_config=yes : creating new configuration files"
if test ! "x$oldconfsuffix" = "x"; then
if test -r "$globus_etc_location/grid-info-slapd.conf" ; then
debug_echo "Making backup of $globus_etc_location/grid-info-slapd.conf"
cp -pf $globus_etc_location/grid-info-slapd.conf \
$globus_etc_location/grid-info-slapd.conf$oldconfsuffix
fi
fi
std-header $globus_etc_location/grid-info-slapd.conf
(
schemacheck="off"
sizelimit="-1"
threads=""
timelimit=""
conf_read mds
test ! "x$schemacheck" = "x" && echo "schemacheck ${schemacheck}"
test ! "x$sizelimit" = "x" && echo "sizelimit ${sizelimit}"
test ! "x$threads" = "x" && echo "threads ${threads}"
test ! "x$timelimit" = "x" && echo "timelimit ${timelimit}"
echo
schemas=""
debug_echo "Using provider_path: $provider_path"
for p in `conf_entries mds/gris/provider`; do
provider=""
conf_read mds/gris/provider/$p
provider=${provider:-$p}
provider_cmd=""
if test `echo $provider|cut -c1` != "/"; then
for i in `echo $provider_path | tr ':' '\n'|tac` ; do
if test -x $i/${provider}.schemalist ; then
provider_cmd=$i/${provider}.schemalist
fi
done
provider=$provider_cmd
fi
if test "x$provider" = "x" ; then
echo "" 1>&2
echo "No schemalist script found for provider <$p>" 1>&2
do_exit 1
fi
if test ! -x "$provider" ; then
echo "" 1>&2
echo "Problem executing schemalist script <$provider> for provider <$p>" 1>&2
do_exit 1
fi
debug_echo "Using schemalist: $provider"
schemas="$schemas $provider"
done
# Add schemas from GIIS's
for g in `conf_entries mds/giis`; do
schemalist=""
conf_read mds/giis/$g
schemas="$schemas $schemalist"
done
echo "#"
echo "# Schemas"
echo "#"
if [ -n "$schemas" ]; then
for s in $schemas ; do
$s
done|\
cat -n | sort -suk 2 | sort -nk 1 | cut -f 2 | \
sed -e [log in to unmask]*@@' -e 's@^ *@@' -e 's@ *$@@' |grep -v '^$' |\
sed 's@^@include@' | \
# Expand variables
while read a ; do
eval echo "$a"
done | \
sed 's@^include *\(.*\) *$@include \1@' |\
# Keep the correct order but have unique entries
while read line ; do
if ! grep -q `echo $line|sed -e 's/ *include *//' -e 's/ *$//'` \
$globus_etc_location/grid-info-slapd.conf ; then
echo $line
fi
done
fi
echo
echo "pidfile ${pid_file}"
echo "argsfile ${argsfile}"
echo
) >> $globus_etc_location/grid-info-slapd.conf
#
# Modulepath
#
if test "x$globus_flavor_name" = "x" ; then
for i in $GLOBUS_LOCATION/etc/globus_packages/globus_openldap/*_pgm*gpt; do
globus_flavor_name=`basename $i|sed 's@pkg_data_\(.*\)_pgm.gpt@\1@'`
done
fi
if test "x$globus_flavor_name" = "x" ; then
echo "Can not guess globus_flavor_name - please specify"
do_exit 1
else
if test $debug_level -gt 0 ; then
debug_echo "Using flavor: $globus_flavor_name"
else
echo -n " ($globus_flavor_name)"
fi
fi
modulepath="$GLOBUS_LOCATION/libexec/openldap/$globus_flavor_name"
debug_echo "Using module path: $modulepath"
if test -d "$modulepath"; then
echo "modulepath $modulepath" >> $globus_etc_location/grid-info-slapd.conf
else
echo "Module path $modulepath does not exist"
do_exit 1
fi
#
# LDAP modules
#
(
modules=""
for module in `conf_entries mds`; do
conf_read mds/$module
if [ -z "$moduleload" ]; then
case $module in
gris) moduleload="libback_ldif.la" ;;
giis) moduleload="libback_giis.la" ;;
esac
fi
modules="$modules $moduleload"
moduleload=""
done
echo $modules | tr ' ' '\n' |sort |uniq|sed 's/^/moduleload /' \
>> $globus_etc_location/grid-info-slapd.conf
)
#
# GRIS
#
if conf_match mds/gris; then
# grid-info-slapd.conf
(
# Gris Defaults
access="access to * by * write"
backends=ldif
suffix="\"Mds-Vo-name=local, o=grid\""
conf="$globus_etc_location/grid-info-resource-ldif.conf"
anonymousbind=yes
allowstaledata=no
# backend_path="$globus_etc_location"
conf_read mds/gris
# Simple support for a standard gris and other backend
for b in `echo $backends | tr : ' '`; do
debug_echo "Using backend: $b"
if test "x$b" = "xldif" ; then
echo ""
echo "# Standard GRIS"
echo "database ldif"
echo "suffix $suffix"
echo "conf $conf"
echo "anonymousbind $anonymousbind"
echo "allowstaledata $allowstaledata"
if [ -r "$access" ]; then
cat $access
else
echo "$access"
fi
else
# Check for executable backend description
if test `echo $b|cut -c1` != "/"; then
if test -x "$b" ; then
$b
fi
fi
fi
done
) >> $globus_etc_location/grid-info-slapd.conf
# grid-info-resource-register.conf
if test ! "x$oldconfsuffix" = "x"; then
if test -r "$globus_etc_location/grid-info-resource-register.conf" ; then
debug_echo "Making backup of $globus_etc_location/grid-info-resource-register.conf"
cp -pf $globus_etc_location/grid-info-resource-register.conf \
$globus_etc_location/grid-info-resource-register.conf$oldconfsuffix
fi
fi
std-header $globus_etc_location/grid-info-resource-register.conf
(
for p in `conf_entries mds/gris/registration`; do
# GRIS defaults
regname="$p"
reghn=""
regport=2135
regperiod=120
port=$GRID_INFO_PORT
rootdn="Mds-Vo-name=local, o=grid"
ttl=$[ $regperiod * 2 ]
timeout=45
cachettl=15
sizelimit=0
bindmethod=ANONYM-ONLY
servicename=""
conf_read mds/gris/registration/$p
# Register to the local machine
reghn=${reghn:-$GLOBUS_HOSTNAME}
if test ! "x$servicename" = "x"; then
rootdn="$servicename=$GLOBUS_HOSTNAME, $rootdn"
fi
debug_echo "Register \"$rootdn\" to $reghn:$regport/$regname"
printregldif gris
done
) >> $globus_etc_location/grid-info-resource-register.conf
# grid-info-resource-ldif.conf
(
if test ! "x$oldconfsuffix" = "x"; then
if test -r "$globus_etc_location/grid-info-resource-ldif.conf" ; then
debug_echo "Making backup of $globus_etc_location/grid-info-resource-ldif.conf"
cp -pf $globus_etc_location/grid-info-resource-ldif.conf \
$globus_etc_location/grid-info-resource-ldif.conf$oldconfsuffix
fi
fi
std-header $globus_etc_location/grid-info-resource-ldif.conf
for p in `conf_entries mds/gris/provider`; do
(
conf_read mds/gris/provider/$p
provider=${provider:-$p}
provider_cmd=""
if test `echo $provider|cut -c1` != "/"; then
for i in `echo $provider_path | tr ':' '\n'|tac` ; do
if test -x $i/${provider}.info ; then
provider_cmd=$i/${provider}.info
fi
done
provider=$provider_cmd
fi
if test "x$provider" = "x" ; then
echo "" 1>&2
echo "No provider script found for provider <$p>" 1>&2
do_exit 1
fi
if test ! -x "$provider" ; then
echo "" 1>&2
echo "Problem executing provider script <$provider> for provider <$p>" 1>&2
do_exit 1
fi
debug_echo "Using provider info: $provider"
(
echo
$provider
) >> $globus_etc_location/grid-info-resource-ldif.conf
)
done
)
fi
#
# GIIS
#
if conf_match mds/giis; then
access="access to * by * write"
anonymousbind=yes
allowstaledata=no
conf=""
conf_read mds/giis
for vo in `conf_entries mds/giis`; do
(
#
# Allow local GRIS by default (override with allow=""
#
allowreg="$GLOBUS_HOSTNAME:$GRID_INFO_PORT"
policyfile=""
conf_read mds/giis/$vo
if [ -z "$name" ]; then
echo "" 1>&2
echo "Please use name=<vo name> for the VO $vo" 1>&2
do_exit 1
fi
# Use the grid-info-site files as templates
if test "x$conf" = "x"; then
conf="$globus_etc_location/grid-info-${vo}-giis.conf"
if test ! -f "$conf"; then
cp -p $GLOBUS_LOCATION/etc/grid-info-site-giis.conf $conf
fi
fi
echo ""
echo "# GIIS/VO : $name"
echo "database giis"
echo "suffix \"Mds-Vo-name=$name, o=grid\""
echo "conf $conf"
echo "policyfile ${policyfile:-$globus_etc_location/grid-info-${vo}-policy.conf}"
echo "anonymousbind $anonymousbind"
echo "allowstaledata $allowstaledata"
if [ -r "$access" ]; then
cat $access
else
echo "$access"
fi
) >> $globus_etc_location/grid-info-slapd.conf
#
# Create policyfile if the user has not specified one
#
if test "x$policyfile" = "x" ; then
if test ! "x$oldconfsuffix" = "x"; then
if test -r "$globus_etc_location/grid-info-${vo}-policy.conf" ; then
debug_echo "Making backup of $globus_etc_location/grid-info-${vo}-policy.conf"
cp -pf $globus_etc_location/grid-info-${vo}-policy.conf \
$globus_etc_location/grid-info-${vo}-policy.conf$oldconfsuffix
fi
fi
# Create policy file
std-header $globus_etc_location/grid-info-${vo}-policy.conf
(
cat <<-EOF
#
#
# MDS registration policy file
#
# example:
# objectclass: MdsRegistrationPolicy
# policydata: (&(Mds-Service-hn=dc-*.isi.edu)(Mds-Service-port=2135))
#
#
EOF
conf_read mds/giis/$vo
if test ! "x$allowreg" = "x" ; then
echo "objectclass: MdsRegistrationPolicy"
printf "policydata: (|"
i=0
tempvar=$allowreg
while test ! -z "$tempvar" ; do
hn=""
port=""
suffix=""
hn=`echo $tempvar|cut -d: -f1 |cut -f1 -d/`
echo "$tempvar" | grep -q ":" && port=`echo $tempvar|cut -d: -f2|cut -d/ -f1`
echo "$tempvar" | grep -q "/" && suffix=`echo $tempvar|cut -d: -f2|cut -d/ -f2`
#
# Force en space after comma in suffix - Globus Magic
#
suffix=`echo $suffix | sed 's@, *@, @g'`
printf "(&"
if test ! "x$hn" = "x" ; then
printf "(Mds-Service-hn=$hn)"
fi
if test ! "x$port" = "x" ; then
printf "(Mds-Service-port=$port)"
fi
if test ! "x$suffix" = "x" ; then
printf "(Mds-Service-Ldap-suffix=$suffix)"
fi
printf ")"
rtmp=""
test ! "x$hn" = "x" && rtmp="$rtmp$hn"
test ! "x$port" = "x" && rtmp="$rtmp:$port"
test ! "x$suffix" = "x" && rtmp="$rtmp/$suffix"
debug_echo " Allow registration to $vo from : $rtmp"
i=$[$i+1]
tempvar=`eval echo '$allowreg'_$i`
done
echo ")"
fi
) >> $globus_etc_location/grid-info-${vo}-policy.conf
fi
# if [ -x $GLOBUS_LOCATION/etc/$p ]; then
# $GLOBUS_LOCATION/etc/$p
# fi
(
for r in `conf_entries mds/giis/$vo/registration`; do
# GIIS defaults
regname="$r"
reghn=""
regport=2135
regperiod=120
port=$GRID_INFO_PORT
name=$vo
ttl=$[ $regperiod * 2 ]
timeout=120
cachettl=30
sizelimit=0
bindmethod=ANONYM-ONLY
conf_read mds/giis/$vo
conf_read mds/giis/$vo/registration/$r
rootdn="Mds-Vo-name=$name, o=grid"
if [ -n "$regname" -a -n "$reghn" ]; then
printregldif giis
debug_echo "Register \"$rootdn\" to $reghn:$regport/$regname"
fi
done
) >> $globus_etc_location/grid-info-resource-register.conf
done
fi
fi # overwrite_config
# Start the whole MDS subsystem through grid-info-soft-register
CMD="$GLOBUS_LOCATION/sbin/grid_info_daemon - $GLOBUS_LOCATION/sbin/grid-info-soft-register -log $logfile -f $globus_etc_location/grid-info-resource-register.conf -- "
# Use the raw slapd rather than grid-info-slapd since we setup the environment ourselves
# slapd_cmd="$GLOBUS_LOCATION/libexec/grid-info-slapd"
slapd_cmd="$GLOBUS_LOCATION/libexec/slapd"
CMD="$CMD /usr/bin/strace -f -o /tmp/slapd-`date +%y%m%d-%H%M%S`-$$.txt "
CMD="$CMD $slapd_cmd -h ldap://${GLOBUS_HOSTNAME}:${GRID_INFO_PORT} -f $globus_etc_location/grid-info-slapd.conf -d $debug_level"
# Supported limits:
#
# limit_core - limits the core file size (KB)
# limit_nofile - max number of open files
# Default limits: inherit from shell. Otherwise use:
ulimit -c 0
# core - limits the core file size (KB)
if test ! "x$limit_core" = "x" ; then
ulimit -c $limit_core
debug_echo "Requested/resulting max core file size : $limit_core/`ulimit -c`"
fi
# nofile - max number of open files
if test ! "x$limit_nofile" = "x" ; then
ulimit -n $limit_nofile
debug_echo "Requested/resulting number of max open files : $limit_nofile/`ulimit -n`"
fi
[ -n "$user" ] && CMD="$CMD -u $user"
# Environment variables
GRID_SECURITY_DIR=0
conf_read common
conf_read mds
for v in X509_USER_CERT X509_USER_KEY GRIDMAP GRIDMAPDIR\
GLOBUS_TCP_PORT_RANGE GLOBUS_UDP_PORT_RANGE; do
eval $v=\${`echo $v| tr '[A-Z]' '[a-z]'`:-\"\"}
# eval echo $v=`echo '${'$v'}'`
if [ -n "`eval echo '${'$v'}'`" ]; then
eval export `eval echo $v`
fi
done
# Mandatory non-empty variables
LD_LIBRARY_PATH=$GLOBUS_LOCATION/lib:$LD_LIBRARY_PATH
SASL_PATH=$GLOBUS_LOCATION/lib/sasl
GRIDMAP=${GRIDMAP:-/etc/grid-security/grid-mapfile}
X509_RUN_AS_SERVER=true
# Try (as Globus) to locate cert+key if not specified
if [ ! -z "${GRID_SECURITY_DIR}" ] &&
[ -r "${GRID_SECURITY_DIR}/ldap/ldapkey.pem" ] &&
[ -r "${GRID_SECURITY_DIR}/ldap/ldapcert.pem" ] ; then
X509_USER_CERT=${X509_USER_CERT:-${GRID_SECURITY_DIR}/ldap/ldapcert.pem}
X509_USER_KEY=${X509_USER_KEY:-${GRID_SECURITY_DIR}/ldap/ldapkey.pem}
elif [ -r "/etc/grid-security/ldap/ldapkey.pem" ] &&
[ -r "/etc/grid-security/ldap/ldapcert.pem" ] ; then
X509_USER_CERT=${X509_USER_CERT:-/etc/grid-security/ldap/ldapcert.pem}
X509_USER_KEY=${X509_USER_KEY:-/etc/grid-security/ldap/ldapkey.pem}
secconfdir="/etc/grid-security"
elif [ -r "${GLOBUS_LOCATION}/etc/ldap/ldapkey.pem" ] &&
[ -r "${GLOBUS_LOCATION}/etc/ldap/ldapcert.pem" ] ; then
secconfdir="${GLOBUS_LOCATION}/etc"
X509_USER_CERT=${X509_USER_CERT:-${GLOBUS_LOCATION}/etc/ldap/ldapcert.pem}
X509_USER_KEY=${X509_USER_KEY:-${GLOBUS_LOCATION}/etc/ldap/ldapkey.pem}
fi
debug_echo "Using grid-mapfile: $GRIDMAP"
debug_echo "Using cert: ${X509_USER_CERT:-<no ldap certificate found>}"
debug_echo "Using key : ${X509_USER_KEY:-<no ldap key found>}"
export SASL_PATH
export LD_LIBRARY_PATH
export X509_RUN_AS_SERVER
export X509_USER_CERT
export X509_USER_KEY
export GRIDMAP
# This could be better
# daemon $CMD &
if test $debug_level -gt 0 ; then
debug_echo "Executing: $CMD > /dev/null 2>&1 &"
fi
# exec $CMD > /dev/null 2>&1 &
# daemon $CMD &
ulimit -c unlimited
cd /tmp
$CMD &
RETVAL=$?
[ "$RETVAL" = 0 ] && success
[ "$RETVAL" = 0 ] && touch $lockfile
echo
}
stop()
{
echo -n "Stopping Globus MDS"
if [ -f $pid_file ] ; then
kill `cat $pid_file` && success "$prog shutdown" || failure "$prog shutdown"
rm -f $pid_file $lockfile
else
failure "$prog shutdown"
fi
su edginfo -c '
echo signal 15
kill -15 -1
sleep 5
echo signal 9
kill -9 -1
echo again signal 9
kill -9 -1
'
echo
}
#status()
#{
# if [ "`cat $pid_file`" != "" ] ; then
# echo $"${base} (pid `cat $pid_file`) is running..."
# return 0
# fi
#}
status()
{
if [ "`cat $pid_file 2>/dev/null`" != "" ] ; then
echo "$1 (pid `cat $pid_file`) is running..."
return 0
else
echo "$1 is stopped"
return 1
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
stop
start
;;
condrestart)
if [ -f $lockfile ] ; then
stop
# avoid race
sleep 3
start
fi
;;
status)
status $prog
RETVAL=$?
;;
*)
echo "Usage: $0 {start|stop|restart|reload|condrestart|status}"
RETVAL=1
;;
esac
do_exit $RETVAL
|