Announce

PukiWiki contents have been moved into SONOTS Plugin (20070703)

14.killps

プロセス名指定 kill

投稿者s1080134
作成日2003/09/09 (学部4年夏休み)
最終更新日2003/09/09
言語bash
Table of Contents

説明

kill コマンドを使用する際に、プロセス ID ではなくコマンド名で指定するための CUI フロントエンドです。

後記:会津大学の環境にはもちろん、Linuxディストリにも killall がなかった時代だったような気がします。

書式

使い方は以下のようになっています。

   String specification kill. kill front end.
   Usage: killps [kill_options] [: [egrep options]] pattern
            ex) killps emacs
            ex) killps -9 emacs
            ex) killps '.*'
            ex) killps 'emacs|kterm'
            ex) killps : -v tcsh
            ex) killps -KILL : -v tcsh
            ex) yes | killps -9 : -v tcsh
          Note: Don't use kill's [-s signal] option. Use [-signal] option

マッチするプロセスがあれば

   s1080134 4887 225 0 16:44:08 pts/1 0:00 mnews
   kill 4887 ? (y/[n])

のように聞いてくるので、y か n を入力してください。そのような確認がいらないという場合は yes コマンドを使用してください。また文字列マッチングには egrep コマンドを使っているので egrep の正規表現を使えます。その際は、シェルのワイルドカードにならないように ' ' ではさむなどしてください。 egrep のオプションを使用する際は、 kill のオプションではないことを示すために : を先頭に入力してください。

ソースコード

#!/usr/local/bin/bash
# Copyright (C) Naotoshi Seo, s1080134

function printUsage(){
  cmd=${0##*/}
  echo "String specification kill. kill front end." 1>&2
  echo "Usage: $cmd [kill_options] [: [egrep options]] pattern" 1>&2
  echo "         ex) $cmd emacs" 1>&2
  echo "         ex) $cmd -9 emacs" 1>&2
  echo "         ex) $cmd '.*'" 1>&2 
  echo "         ex) $cmd 'emacs|kterm'" 1>&2 
  echo "         ex) $cmd : -v tcsh" 1>&2
  echo "         ex) $cmd -KILL : -v tcsh" 1>&2
  echo "         ex) yes | $cmd -9 : -v tcsh" 1>&2
  echo "       Note: Don't use kill's [-s signal] option. Use [-signal] option" 1>&2
}

if [ $# -lt 1 ]; then
  printUsage
  exit 0
fi

if [ "$1" = ":" ];then
  shift
else
  #Kill Options
  while [ $# -gt 0 ]
    do
    if [ $(expr "x$1" : 'x-') -eq 0 ];then
	if [ "$1" = ":" ];then
	    shift
	fi
	break
    fi
    options="$options$1 "
    shift
  done
  if [ $# -eq 0 ]; then
    printUsage
    exit 1
  fi
fi

#main
for ps in `/bin/ps -f -u $USER | grep -v $0 | egrep "$@" | sed 's/ /;/g'` 
  do
  ps=`echo "$ps" | sed 's/;/ /g'`
  echo "$ps"
  pid=`echo $ps | awk '{print \$2}'`
  [ $(expr "$pid" : '[0-9]*$') -eq 0 ] && continue
  echo -n "kill $options$pid ? (y/[n]) "
  read reply
  [ "$reply" == "y" ] && kill $options$pid
done