【Shell】批量kill进程的shell脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
[root@node2 ~]# cat mykill.sh #!/bin/sh if [ $# -ne 1 ] then echo "Usage:[ sh mykill.sh gzh ]" exit 1 fi r=`ps aux | grep "$1" | grep -v "grep" | grep -v "$0"` if [ -z "$r" ] then echo 'Empty set' exit 1 fi read -n 1 -p "Do you want to continue [Y/N]? (default N) " answer if [ -z "$answer" ] then answer='n' fi case $answer in Y|y) ps aux | grep "$1" | grep -v "grep" | grep -v "$0" | awk '{print $2}' | xargs -i kill -9 {} ;; N|n) exit 1 ;; esac [root@node2 ~]# |
解读第一段儿:
1 2 3 4 5 6 7 8 9 |
if [ $# -ne 1 ] then echo "Usage:[ sh mykill.sh gzh ]" exit 1 fi $#:传递给脚本或函数的参数个数 -ne :不等于 判断shell脚本传入是否为1个参数,如果不是一个参数,那么打印Usage:[ sh mykill.sh gzh ],之后退出shell脚本 |
第二段儿:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
r=`ps aux | grep "$1" | grep -v "grep" | grep -v "$0"` if [ -z "$r" ] then echo 'Empty set' exit 1 fi $1:传入的第一个参数 $0:shell脚本的名称 -z:判断变量的值,是否为空; 为空,返回0,为true 非空,返回1,为false 当执行的ps命令,返回的结果为空时,那么退出shell脚本。 |
第三段儿:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
read -n 1 -p "Do you want to continue [Y/N]? (default N) " answer if [ -z "$answer" ] then answer='n' fi read:命令从标准输入中读取一行,并把输入行的值赋值给指定变量 -n:设置read命令计数输入的字符。当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量(answer) -n 1:只接受一个字符 -p:“提示语句” "Do you want to continue [Y/N]? (default N) " if [ -z "$answer" ]: -z:判断变量的值,是否为空; 为空,返回0,为true 非空,返回1,为false 当接收的变量($answer)为空时,返回true,进入if语句,赋值N,也就是提示中的“default N” |
第四段儿:
1 2 3 4 5 6 7 8 9 10 11 |
case $answer in Y|y) ps aux | grep "$1" | grep -v "grep" | grep -v "$0" | awk '{print $2}' | xargs -i kill -9 {} ;; N|n) exit 1 ;; esac case语句 当输入的值为Y,那么执行批量kill语句 |
第四段儿可以替换为另一种写法,利用for循环。结果虽然一样,都是kill掉了进程,但是利用for循环逐一kill进程时,交互更友好一些。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
case $answer in Y|y) pids=`ps -ef|grep "$1"|grep -v "grep"|grep -v "$0"|awk '{ print $2}'` for i in $pids do echo "Kill the $1 process [ $i ]" kill -9 $i done ;; N|n) exit 1 ;; esac |