Shell Kill 进程树


Shell 脚本程序往往会创建很多进程,当出现问题或者想终止执行的时候很麻烦,有时候忘记kill子进程,会出现一些很诡异的情况(如子进程需要写文件)。写个脚本kill进程树,方便以后系统维护使用。

  1. #!/bin/sh  
  2.   
  3. if [ $# -ne 1 ]  
  4. then  
  5.     echo -e "\033[;36mUsage:\033[0m" "\033[;32mkillall\033[0m" "\033[;33mPID\033[0m"  
  6.     exit  
  7. else  
  8.     root=$1  
  9. fi  
  10.   
  11. function treekill()  
  12. {  
  13.     local father=$1  
  14.   
  15.     # children  
  16.     childs=(`ps -ef | \  
  17.              awk -v father=$father 'BEGIN{ ORS=" "; } $3==father{ print $2; }'`)  
  18.     if [ ${#childs[@]} -ne 0 ]  
  19.     then  
  20.         for child in ${childs[*]}  
  21.         do  
  22.             treekill $child  
  23.         done  
  24.     fi  
  25.   
  26.     # father   
  27.     echo -e "\033[;32mkill\033[0m" "\033[;36mpid\033[0m" "\033[;33m$father\033[0m"  
  28.     kill -9 $father  
  29. }  
  30.   
  31. treekill $root  

测试一下:

test.sh 如下

  1. #!/bin/sh  
  2.   
  3. sh ./test1.sh &  
  4. sleep 55555555 &  
  5. sleep 7777777  
test1.sh 如下
  1. #!/bin/sh  
  2.   
  3. sleep 55555555 &  
  4. sleep 7777777  
运行
  1. sh test.sh &  
  2. killtree pid # test.sh 的进程ID  

相关内容