51 lines
1.6 KiB
Bash
Executable File
51 lines
1.6 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
type pgrep > /dev/null || exit 1
|
|
[ 2 -gt $# ] && echo -e "\tUsage:$0 {start|stop} {cmd}\n" && exit 1
|
|
|
|
cd $(dirname $0)/../
|
|
WATCH_LOG=/var/log/watch_proc.log
|
|
WATCH_NAME=$(basename $0)
|
|
OPERATION=$1
|
|
shift
|
|
PROC_CMD="$*"
|
|
PROC_NAME=$(basename ${PROC_CMD%% *})
|
|
|
|
function StopProc {
|
|
local cpids=$(pgrep -P $1)
|
|
local cpid=
|
|
printf "%${2}s|-$1\n"
|
|
[ -f /proc/$1/stat ] && kill $1
|
|
local n=$(expr 2 + $2)
|
|
for cpid in $cpids; do
|
|
StopProc "$cpid" $n
|
|
done
|
|
}
|
|
|
|
case $OPERATION in
|
|
start)
|
|
pid=$(pgrep -f "$WATCH_NAME +start +[^ ]*\<$PROC_NAME\>")
|
|
pid=$(echo -e "$pid"|grep -v "^$$$")
|
|
[ -n "$pid" ] && echo "WATCH on \"$PROC_CMD\" is runing with PID:$pid" && exit 2
|
|
while :; do
|
|
$PROC_CMD > /dev/null 2>/dev/null &
|
|
pid=$!
|
|
while sleep 4; do [ -f /proc/$pid/stat ] || break; done
|
|
echo "$(date +'%F %T') \"$PROC_CMD\" quit exceptionally!" >> $WATCH_LOG
|
|
StopProc "$pid" 0 >> $WATCH_LOG
|
|
echo "$(date +'%F %T') \"$PROC_CMD\" restart." >> $WATCH_LOG
|
|
done > /dev/null 2>/dev/null & ;;
|
|
stop)
|
|
ppid=$(pgrep -f "$WATCH_NAME +start +[^ ]*\<$PROC_NAME\>")
|
|
[ -z "$ppid" ] && echo "No WATCH on \"$PROC_CMD\" !" && exit 1
|
|
pid=$(pgrep -lP $ppid|grep -v '^[0-9]\+ \+sleep$'|awk '{print $1}')
|
|
[ -z "$pid" ] && echo "No process: \"$PROC_CMD\"" && kill -9 $ppid && exit 0
|
|
kill -9 $ppid
|
|
echo "$(date +'%F %T') \"$PROC_CMD\" quit manually." >> $WATCH_LOG
|
|
StopProc "$pid" 0
|
|
exit 0 ;;
|
|
*)
|
|
echo -e "\tUsage:$0 start|stop cmd argv ...\n" ;;
|
|
esac
|
|
|