From ef49e1db91ffb345ebbc3033d8bd72006985446a Mon Sep 17 00:00:00 2001 From: zimoch Date: Fri, 4 Sep 2020 14:34:48 +0000 Subject: [PATCH] using procServ --- shellbox | 132 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 93 insertions(+), 39 deletions(-) diff --git a/shellbox b/shellbox index ab5d5a7..828a8ec 100755 --- a/shellbox +++ b/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]}" ;;