名前で指定したプロセスにシグナルを送る

#!/bin/sh
#killall.sh
#デフォルトではスクリプトを実行したユーザーがオーナーになっているプロセスだけを
#killする(実行ユーザーがrootの場合は除く)。プロセスに送るシグナルは
#-s SIGNAL、ユーザーは-u userで、端末は-t ttyで指定する
#-nフラグを指定すると実行するコマンドを表示するだけで実際の処理は行わない

signal="-INT"
user=""
tty=""
donothing=0

while getopts "s:u:t:n" opt; do
    case "$opt" in
        s) signal="-$OPTARG" ;;
        u) if [ ! -z "$tty" ]; then
            echo "$0: error: -u and -t are mutually exclusive." >&2
            exit 1
           fi
           user=$OPTARG ;;
        t) if [ ! -z "$user" ]; then
            echo "$0: error: -u and -t are mutually exclusive." >&2
            exit 1
           fi
           tty=$OPTARG ;;
        n) donothing=1 ;;
        ?) echo "Usage: $0 [-s signal] [-u user | -t tty] [-n] patten" >&2
            exit 1
    esac
done

shift $(( $OPTIND - 1 ))

if [ $# -eq 0 ]; then
    echo "Usage: $0 [-s signal][-u user|-t tty][-n] pattern" >&2
    exit 1
fi

if [ ! -z "$tty" ]; then
    pids=$(ps cu -t $tty | awk "/ $1$/ { print \$2 }")
elif [ ! -z "$user" ]; then
    pids=$(ps cu -u $user | awk "/ $1$/ { print \$2 }")
else
    pids=$(ps cu -u ${USER:-LOGNAME} | awk "/ $1$/ { print \$2 }")
fi

if [ -z "$pids" ]; then
    echo "$0: no processes match pattern $1" >&2
    exit 1
fi

for pid in $pids; do
    if [ $donothing -eq 1 ]; then
        echo "kill $signal $pid"
    else
        kill $signal $pid
    fi
done

exit 0