using procServ
This commit is contained in:
132
shellbox
132
shellbox
@@ -3,48 +3,85 @@
|
||||
# chkconfig: 2345 98 2
|
||||
# description: shellbox service for spawning programs
|
||||
|
||||
. /etc/rc.d/init.d/functions
|
||||
. /etc/profile
|
||||
export PATH=$PATH:/usr/local/bin
|
||||
|
||||
export HOSTNAME=$(hostname -s)
|
||||
# AD84: export HOSTNAME=$(hostname -s)
|
||||
|
||||
exe=/usr/local/bin/shellbox.tcl
|
||||
|
||||
# AD84: added
|
||||
if [ -f /usr/local/bin/getIocBootEnv ]
|
||||
then
|
||||
. /usr/local/bin/getIocBootEnv
|
||||
#echo ""
|
||||
#echo "shellbox: IOC=$IOC"
|
||||
#echo "shellbox: FACILITY=$FACILITY"
|
||||
#echo "shellbox: ROOTFSSERVERIP=$ROOTFSSERVERIP"
|
||||
#echo "shellbox: BOOTPC=$BOOTPC"
|
||||
#echo "shellbox: CMDLINE_HOST=$CMDLINE_HOST"
|
||||
#echo "shellbox: CMDLINE_ETH=$CMDLINE_ETH"
|
||||
#echo "shellbox: BOOTIF_BCAST=$BOOTIF_BCAST"
|
||||
#echo "shellbox: BOOTIF_IP=$BOOTIF_IP"
|
||||
#echo ""
|
||||
fi
|
||||
if [ "$IOC" == "" ]
|
||||
then
|
||||
HOSTNAME=$(hostname -s)
|
||||
else
|
||||
HOSTNAME=$IOC
|
||||
fi
|
||||
export HOSTNAME
|
||||
# AD84: end added
|
||||
|
||||
|
||||
exe=/usr/local/bin/procServ
|
||||
options="-k ^X --killsig 15 -x ^D -i ^C --allow -c"
|
||||
prog=shellbox
|
||||
params=
|
||||
conf=/etc/shellbox.conf
|
||||
logdir=/var/log/$prog
|
||||
shells=/var/run/$prog
|
||||
|
||||
[ -n "$logdir" -a -d $logdir ] || mkdir $logdir
|
||||
|
||||
fail () {
|
||||
echo -n $@
|
||||
failure
|
||||
echo
|
||||
echo $@
|
||||
exit 1
|
||||
}
|
||||
|
||||
echo_failure () {
|
||||
echo " [failed]"
|
||||
}
|
||||
|
||||
checkpid () {
|
||||
[ -d /proc/$PID ]
|
||||
}
|
||||
|
||||
launch () {
|
||||
[ -f /ioc/${HOSTNAME}/DoNotStartEpics ] && fail "Not starting EPICS because /ioc/${HOSTNAME}/DoNotStartEpics exists"
|
||||
if [ "$1" = "-reload" ]
|
||||
then
|
||||
reload=YES
|
||||
shift
|
||||
fi
|
||||
temp=$(mktemp -p $(dirname $shells)) || fail "can't create temporary file"
|
||||
while read PORT USER DIR COMMAND
|
||||
while read PORT USER DIR COMMAND ARGS
|
||||
do
|
||||
# check for empty lines and comments
|
||||
[[ $PORT == "" || $PORT == \#* ]] && continue
|
||||
|
||||
# AD84: added
|
||||
DIR=${DIR//_IOCNAME_/$HOSTNAME}
|
||||
ARGS=${ARGS//_IOCNAME_/$HOSTNAME}
|
||||
# AD84: end added
|
||||
|
||||
# check if already started shell is still alive
|
||||
if LINE=$(grep "$PORT $USER $DIR $COMMAND" $shells 2> /dev/null)
|
||||
if LINE=$(grep "$PORT $USER $DIR $COMMAND $ARGS" $shells 2> /dev/null)
|
||||
then
|
||||
PID=${LINE%% *}
|
||||
if checkpid $PID
|
||||
then
|
||||
if [ -z "$reload" ] && [ -z "$*" ] || echo "$*" | grep -qw $PORT
|
||||
if [ -z "$reload" ] && [ -z "$*" ] || echo "$*" | grep -qE "(^|[[:space:]])$PORT([[:space:]]|$)"
|
||||
then
|
||||
echo_warning
|
||||
echo "Already running: $PORT $USER $DIR $COMMAND"
|
||||
echo "Already running: $PORT $USER $DIR $COMMAND $ARGS"
|
||||
fi
|
||||
echo "$LINE" >> $temp
|
||||
continue
|
||||
@@ -52,10 +89,11 @@ launch () {
|
||||
fi
|
||||
|
||||
# check if we have to start all shells or only this PORT
|
||||
[ "$*" ] && echo "$*" | grep -qwv $PORT && continue
|
||||
[ "$*" ] && echo "$*" | grep -qvE "(^|[[:space:]])$PORT([[:space:]]|$)" && continue
|
||||
|
||||
if [ -n "$logdir" ]
|
||||
then
|
||||
[ -d $logdir ] || mkdir -m 777 $logdir
|
||||
LOG=$logdir/$PORT
|
||||
rm -f $LOG
|
||||
else
|
||||
@@ -63,20 +101,28 @@ launch () {
|
||||
fi
|
||||
|
||||
# start shellbox as other user
|
||||
echo -n Starting: $PORT $USER $DIR $COMMAND
|
||||
if sudo -E true 2> /dev/null
|
||||
echo -n Starting: $PORT $USER $DIR $COMMAND $ARGS
|
||||
|
||||
if /usr/bin/sudo -E true 2> /dev/null
|
||||
then
|
||||
sudo -H -u $USER SHELLBOX=$HOSTNAME:$PORT $exe -dir $DIR $params $PORT $COMMAND >> $LOG 2>&1 < /dev/null &
|
||||
else
|
||||
export SHELLBOX=$HOSTNAME:$PORT
|
||||
sudo -H -u $USER $exe -dir $DIR $params $PORT $COMMAND >> $LOG 2>&1 < /dev/null &
|
||||
SUDO="/usr/bin/sudo -H -u $USER SHELLBOX=$HOSTNAME:$PORT"
|
||||
elif /usr/bin/sudo true 2> /dev/null
|
||||
then
|
||||
SUDO="/usr/bin/sudo -H -u $USER"
|
||||
fi
|
||||
PID=$!
|
||||
export SHELLBOX=$HOSTNAME:$PORT
|
||||
pidfile=/var/run/procServ-$PORT.pid
|
||||
rm -f $pidfile
|
||||
L=/tmp/$SHELLBOX.log
|
||||
mknod -m 666 $L p 2>/dev/null
|
||||
logger -p local0.info -t shellbox["$PORT"] -f $L &
|
||||
$exe -p $pidfile $options $DIR $params -L $L $PORT $SUDO $(which $COMMAND) $ARGS >> $LOG 2>&1 < /dev/null
|
||||
# check if starting worked or failed
|
||||
sleep 0.1
|
||||
if checkpid $PID
|
||||
usleep 100000
|
||||
if [ -e $pidfile ]
|
||||
then
|
||||
echo "$PID $PORT $USER $DIR $COMMAND" >> $temp
|
||||
PID=$(<$pidfile)
|
||||
echo "$PID $PORT $USER $DIR $COMMAND $ARGS" >> $temp
|
||||
echo
|
||||
else
|
||||
echo_failure
|
||||
@@ -112,9 +158,7 @@ stop () {
|
||||
# anything to stop?
|
||||
if [ ! -r $shells ]
|
||||
then
|
||||
echo -n "$prog: No shells started."
|
||||
success
|
||||
echo
|
||||
echo "$prog: No shells started."
|
||||
exit 0
|
||||
fi
|
||||
if [ -z "$1" ]
|
||||
@@ -131,7 +175,7 @@ stop () {
|
||||
temp=$(mktemp -p $(dirname $shells)) || fail "can't create temporary file"
|
||||
while read PID PORT ARGS
|
||||
do
|
||||
echo "$*" | grep -qw $PORT && stopshell $PID $PORT $ARGS || echo "$PID $PORT $ARGS" >> $temp
|
||||
echo "$*" | grep -qE "(^|[[:space:]])$PORT([[:space:]]|$)" && stopshell $PID $PORT $ARGS || echo "$PID $PORT $ARGS" >> $temp
|
||||
done < $shells
|
||||
mv $temp $shells
|
||||
chmod 0644 $shells
|
||||
@@ -146,23 +190,28 @@ reload () {
|
||||
then
|
||||
#first kill all shells that are not configured any more
|
||||
temp=$(mktemp -p $(dirname $shells)) || fail "can't create temporary file"
|
||||
while read PID ARGS
|
||||
while read PID LINE
|
||||
do
|
||||
while read PORT USER DIR COMMAND
|
||||
while read PORT USER DIR COMMAND ARGS
|
||||
do
|
||||
if [ "$PORT $USER $DIR $COMMAND" = "$ARGS" ]
|
||||
# AD84: added
|
||||
DIR=${DIR//_IOCNAME_/$HOSTNAME}
|
||||
ARGS=${ARGS//_IOCNAME_/$HOSTNAME}
|
||||
# AD84: end added
|
||||
if [ "$PORT $USER $DIR $COMMAND $ARGS" = "$LINE" ]
|
||||
then
|
||||
echo "Keeping: $ARGS"
|
||||
echo "$PID $ARGS" >> $temp
|
||||
echo "Keeping: $LINE"
|
||||
echo "$PID $LINE" >> $temp
|
||||
continue 2
|
||||
fi
|
||||
done < $conf
|
||||
stopshell $PID $PORT $ARGS
|
||||
stopshell $PID $PORT $LINE
|
||||
done < $shells
|
||||
mv $temp $shells
|
||||
chmod 0644 $shells
|
||||
fi
|
||||
#now start all new shells
|
||||
sleep 2
|
||||
launch -reload
|
||||
}
|
||||
|
||||
@@ -174,20 +223,25 @@ status () {
|
||||
shift
|
||||
fi
|
||||
echo -e "pid\tport\tuser\tdir\t\t\tcommand"
|
||||
while read PORT USER DIR CMD
|
||||
while read PORT USER DIR COMMAND ARGS
|
||||
do
|
||||
# check for empty lines and comments
|
||||
[[ $PORT == "" || $PORT == \#* ]] && continue
|
||||
|
||||
# AD84: added
|
||||
DIR=${DIR//_IOCNAME_/$HOSTNAME}
|
||||
ARGS=${ARGS//_IOCNAME_/$HOSTNAME}
|
||||
# AD84: end added
|
||||
|
||||
# check if we have to report all shells
|
||||
[ "$*" ] && echo "$*" | grep -wqv $PORT && continue
|
||||
[ "$*" ] && echo "$*" | grep -qvE "(^|[[:space:]])$PORT([[:space:]]|$)" && continue
|
||||
|
||||
if [ "$logdir" -a "$log" ]
|
||||
then
|
||||
echo "-------------------------------------------------------------------"
|
||||
fi
|
||||
|
||||
if LINE=$(grep "$PORT $USER $DIR $CMD" $shells 2> /dev/null)
|
||||
if LINE=$(grep "$PORT $USER $DIR $COMMAND $ARGS" $shells 2> /dev/null)
|
||||
then
|
||||
PID=${LINE%% *}
|
||||
if checkpid $PID
|
||||
@@ -203,7 +257,7 @@ status () {
|
||||
echo -n STOPPED
|
||||
$SETCOLOR_NORMAL
|
||||
fi
|
||||
echo -e "\t$PORT\t$USER\t$DIR\t$CMD"
|
||||
echo -e "\t$PORT\t$USER\t$DIR\t$COMMAND $ARGS"
|
||||
|
||||
if [ "$logdir" -a "$log" ]
|
||||
then
|
||||
@@ -217,7 +271,7 @@ shift
|
||||
case "$CMD" in
|
||||
(start) start $*;;
|
||||
(stop) stop $*;;
|
||||
(restart) stop $*; start $*;; # kill all shells, then start again
|
||||
(restart) stop $*; sleep 2; start $*;; # kill all shells, then start again
|
||||
(reread|reload) reload $*;; # reload shellbox.conf without killing too much
|
||||
(status) status $*;;
|
||||
(*) echo "Usage: $0 {start [ports]|stop [ports]|restart [ports]|reload|status [-log] [ports]}" ;;
|
||||
|
||||
Reference in New Issue
Block a user