#!/bin/sh
#
# Author: Shuhei Ohkado <shuhei@is.s.u-tokyo.ac.jp>
# Version: 1.4
# this script kills pattern-matched pids by grep-string

# work at
# debian linux 2.2.14
# solaris 2.6, 2.8
# irix 6.5

exec 5>/dev/null

pscmd="ps -ef";
if { (eval $pscmd 1>&5 ); 2>&5; }; then
    echo $pscmd 1>&5
else
    pscmd="ps aux";
fi

pat=""
vpat=""
eval=0
kopt=""
usage=0
debug=0
command=`echo $0|sed -e 's=[^/]*/==g'`

if [ "X$*" = "X" ]; then
    set - -u
fi

while [ "X$*" != "X" ];
do
    case $1 in
    -pat*|-p) case $2 in
	      -*) pat="$pat '`echo $2|sed -e 's/-/\\\\-/'`'";;
              *)  pat="$pat $2";;
              esac
              shift 2;;
    -vpat*|-v) case $2 in
	      -*) vpat="$vpat '`echo $2|sed -e 's/-/\\\\-/'`'";;
	      *)  vpat="$vpat $2";;
              esac
              shift 2;;
    -exe*|-eval|-e|-kill*|-k) eval=1; shift;;
    -opt*|-o) kopt=$2; shift 2;;
    -debug|-d) debug=1; shift 1;;
    -user|-u) pat="$pat `id|sed -e 's/[^(]*(//' -e 's/).*//'`"; shift;;
    -help|-h) usage=1; shift ;;
    -9) kopt=-9; eval=1; shift;;
    -*) echo "Unknow option: $1"; exit; shift;;
    *) pat="$pat $1"; shift 1;;
    esac
done

if [ $debug = 1 ]; then
    echo pat=$pat
    echo vpat=$vpat
    echo kopt=$kopt
    echo eval=$eval
    echo usage=$usage
    echo remain=$*
    echo save=$savearg
    echo debug=$debug
fi

print_usage()
{
cat <<EOF

Usage: $command <options> patterns

print or kill processes by specifying grep-matched/unmatched pattern.
unless specifed -e,-k or -9, then kill commands is not executed.

Options:
  -e,-k : execute kill
  -p : specify pattern-matched expression
  -v : specify unmatch pattern
  -o : specify option (e.g. -9, -HUP)
  -9 : same as -o -9 -e
  -u : same as -p your_id
  -h : help

Examples:
 $command -h
 $command ssh-agent -9
 $command -p pat1 -p user -v pat2
 $command -u xbiff -o -HUP -e
 $command xbiff -o -HUP -k
 $command pat1 pat2 -v pat3 -v pat4 -9
EOF
}

if [ "$usage" = 1 ]; then print_usage; exit; fi;
if [ "X$pat" = "X" ]; then
     echo "pattern is unspecified";
     print_usage;
     eval $pscmd
     exit;
fi;

gpat=`echo $pat| sed -e 's/ / | grep /g'`
gvpat=`echo $vpat| sed -e 's/ / | grep -v /g'`

if [ "X$gpat" = "X" ]; then
    echo "Error: pattern not specified"
    exit
fi
if [ "X$gvpat" = "X" ]; then
    gpat="$pscmd | grep $gpat | egrep -v \"$0|grep\"";
else
    gpat="$pscmd | grep $gpat | grep -v $gvpat | egrep -v \"$0|grep\"";
    echo gpat=$gpat
fi

tmp=`eval $gpat`;

echo "     UID   PID  PPID  C    STIME TTY      TIME CMD"
echo "$tmp"
echo ""

pids=`echo "$tmp" | awk '{print $2}' | xargs`
if [ "X$pids" = "X" ];
then
echo "No process is matched by \"$pat \"" except \"$vpat \"
exit
fi

cmd="kill $kopt $pids"

if [ "$eval" = 1 ]; then
# eval $cmd
 for pid in $pids
 do
 echo "execute kill \"kill $kopt $pid\""
 kill $kopt $pid
 done
else
 echo "kill commad=\"$cmd\""
 echo "you must add option -e, -k or -9 to execute kill"
fi

exit
