linuxcnc/scripts/realtime.in
Sebastian Kuzminsky b21f69e23e realtime script: detect RTAI correctly
The rtai_shm module went away before our Hardy RTAI, so this check has
been broken for years.  rtai_sched now provides the shm device file.

Signed-off-by: Sebastian Kuzminsky <seb@highlab.com>
2015-12-27 15:46:01 -07:00

257 lines
6.1 KiB
Bash

#! /bin/bash
#
# @configure_input@
# on @DATE@
#
export LANG=C
PIDOF=@PIDOF@
CheckKernel() {
case "@KERNEL_VERS@" in
"") ;;
*)
if [ `uname -r` != "@KERNEL_VERS@" ]; then
cat 1>&2 << EOF
RTAPI requires the real-time kernel @KERNEL_VERS@ to run. Before running
this realtime application, reboot and choose this kernel at the boot menu.
EOF
exit 1
fi
esac
}
RUN_IN_PLACE=@RUN_IN_PLACE@
if [ $RUN_IN_PLACE = yes ]; then
# When using RIP make sure PATH includes the directory where rtapi_app
# resides
PATH=@EMC2_HOME@/bin:$PATH; export PATH
fi
CheckConfig(){
prefix=@prefix@
exec_prefix=@exec_prefix@
sysconfdir=@sysconfdir@
if [ $RUN_IN_PLACE = yes ]; then
RTAPICONF=
# check in the LinuxCNC scripts directory
# $0 is the command to run this script
# strip the script name to leave the path
SCRIPT_DIR=${0%/*}
# the path might be relative
# convert it to an absolute path
SCRIPT_DIR=$(cd $SCRIPT_DIR ; pwd -P)
# now look for rtapi.conf there
if [ -f $SCRIPT_DIR/rtapi.conf ] ; then
RTAPICONF=$SCRIPT_DIR/rtapi.conf
fi
else
if [ -f $sysconfdir/linuxcnc/rtapi.conf ]; then
RTAPICONF=$sysconfdir/linuxcnc/rtapi.conf
fi
fi
if [ -z "$RTAPICONF" ] ; then
echo "Missing rtapi.conf. Check your installation." 1>&2
exit 1
fi
INSMOD="@INSMOD@"
RMMOD="@RMMOD@"
LSMOD="@LSMOD@"
FUSER="@FUSER@"
# Import the config
source $RTAPICONF
if [ ! -e $RTLIB_DIR/.runinfo -a -e $RTLIB_DIR/emc2/.runinfo ]; then
# installed system: we don't want our modules mixed up with rtai
RTLIB_DIR=$RTLIB_DIR/emc2
fi
# Export the module path specified in the config.
export MODPATH
# Generate module lists for loading and unloading
# lists contain RTOS modules plus RTAPI and HAL
# unload list is in reverse order
# any module names that are symlinks are resolved to their real names
MODULES_LOAD=
MODULES_UNLOAD=
case $RTPREFIX in
uspace) SHM_DEV=/dev/zero;;
*)
for MOD in $MODULES ; do
eval MOD=\${MODPATH_$MOD}
if [ -z "$MOD" ]; then continue; fi
if [ -L $MOD ]; then
MOD=${MOD%/*}/$(readlink $MOD)
fi
MODULES_LOAD="$MODULES_LOAD $MOD"
MOD="${MOD##*/}"
MOD="${MOD%$MODULE_EXT}"
MODULES_UNLOAD="$MOD $MODULES_UNLOAD"
done
MODULES_LOAD="$MODULES_LOAD $RTLIB_DIR/rtapi$MODULE_EXT $RTLIB_DIR/hal_lib$MODULE_EXT"
MODULES_UNLOAD="hal_lib rtapi $MODULES_UNLOAD"
case "$MODULES" in
*rtai*)
SHM_DEV=/dev/rtai_shm
;;
*mbuff*)
SHM_DEV=/dev/mbuff
;;
esac
esac
}
CheckStatus(){
case $RTPREFIX in
uspace)
if [ -z "$($PIDOF rtapi_app)" ]; then
exit 1
else
exit 0
fi ;;
*)
# check loaded/unloaded status of modules
unset NOTLOADED
for MOD in $MODULES_UNLOAD ; do
if @LSMOD@ | awk '{print $1}' | grep -x $MOD >/dev/null ; then
echo "$MOD is loaded"
else
echo "$MOD is not loaded"
NOTLOADED=NOT
fi
done
if [ -z $NOTLOADED ]; then
exit 0
else
exit 1
fi
esac
}
CheckMem(){
# check for user space processes using shared memory
if [ -e /dev/mbuff ] ; then
# device file exists, check for processes using it
if $FUSER -s /dev/mbuff 2>/dev/null; then
# at least one process is using it
echo "ERROR: Can't remove RTLinux modules, kill the following process(es) first"
$FUSER -v /dev/mbuff
exit 1
fi
elif [ -e /dev/rtai_shm ] ; then
# device file exists, check for processes using it
if $FUSER -s /dev/rtai_shm 2>/dev/null; then
# at least one process is using it
echo "ERROR: Can't remove RTAI modules, kill the following process(es) first"
$FUSER -v /dev/rtai_shm
exit 1
fi
fi
}
Load(){
CheckKernel
case $RTPREFIX in
uspace)
;;
*)
for MOD in $MODULES_LOAD ; do
$INSMOD $MOD || return $?
done
if [ "$DEBUG" != "" ] && [ -w /proc/rtapi/debug ] ; then
echo "$DEBUG" > /proc/rtapi/debug
fi
esac
}
CheckLoaded(){
# this abomination is needed because udev sometimes doesn't
# have the device ready for us in time.
n=0
while [ $n -lt 100 ]; do
[ -w $SHM_DEV ] && return 0
echo "." 1>&2
sleep .1
n=$(($n+1))
done
echo "Can't write to $SHM_DEV - aborting" 1>&2
exit 1
}
Unload(){
CheckKernel
case $RTPREFIX in
uspace)
rtapi_app exit
# wait 5 seconds for rtapi_app to die and be reaped by its parent
START=$SECONDS
while [ 5 -gt $((SECONDS-START)) ]; do
if ! ps -C rtapi_app > /dev/null 2> /dev/null; then
break
fi
sleep 0.1
done
if ps -C rtapi_app > /dev/null 2> /dev/null; then
echo "ERROR: rtapi_app failed to die" 1>&2
fi
ipcrm -M 0x48414c32 2>/dev/null ;# HAL_KEY
ipcrm -M 0x90280A48 2>/dev/null ;# RTAPI_KEY
ipcrm -M 0x48484c34 2>/dev/null ;# UUID_KEY
;;
*)
for module in $MODULES_UNLOAD ; do
$RMMOD $module
done
esac
}
CheckUnloaded(){
# checks to see if all modules were unloaded
STATUS=
for module in $MODULES_UNLOAD ; do
# check to see if the module is installed
if @LSMOD@ | awk '{print $1}' | grep -x $module >/dev/null ; then
echo "ERROR: Could not unload '$module'"
STATUS=error
fi
done
if [ -n "$STATUS" ] ; then
exit 1
fi
}
CMD=$1
case "$CMD" in
start|load)
CheckConfig
Load || exit $?
CheckLoaded
;;
restart|force-reload)
CheckConfig
CheckMem
Unload
CheckUnloaded
Load || exit $?
CheckLoaded
;;
stop|unload)
CheckConfig
CheckMem
Unload || exit $?
;;
status)
CheckConfig
CheckStatus
;;
*)
echo "Usage: $0 {start|load|stop|unload|restart|force-reload|status}" >&2
exit 1
;;
esac
exit 0