Shell 脚本程序往往会创建很多进程,当出现问题或者想终止执行的时候很麻烦,有时候忘记kill子进程,会出现一些很诡异的情况(如子进程需要写文件)。写个脚本kill进程树,方便以后系统维护使用。
- #!/bin/sh
-
- if [ $# -ne 1 ]
- then
- echo -e " 33[;36mUsage: 33[0m" " 33[;32mkillall 33[0m" " 33[;33mPID 33[0m"
- exit
- else
- root=$1
- fi
-
- function treekill()
- {
- local father=$1
-
- # children
- childs=(`ps -ef |
- awk -v father=$father "BEGIN{ ORS=" "; } $3==father{ print $2; }"`)
- if [ ${#childs[@]} -ne 0 ]
- then
- for child in ${childs[*]}
- do
- treekill $child
- done
- fi
-
- # father
- echo -e " 33[;32mkill 33[0m" " 33[;36mpid 33[0m" " 33[;33m$father 33[0m"
- kill -9 $father
- }
-
- treekill $root
测试一下:test.sh 如下
- #!/bin/sh
-
- sh ./test1.sh &
- sleep 55555555 &
- sleep 7777777
test1.sh 如下
- #!/bin/sh
-
- sleep 55555555 &
- sleep 7777777
运行
- sh test.sh &
- killtree pid # test.sh 的进程ID