免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 11167 | 回复: 24

[原创自动查杀超时或僵死的进程的脚本  关闭 [复制链接]

论坛徽章:
0
发表于 2005-10-01 10:15 |显示全部楼层
有时候前置机会出现死进程等,做了这个自动查杀的脚本,已在sco unix505中测试通过,如想测试,可ps -efl >file ,自行修改file里的进程状态及占用时间,再将脚本的输入源由ps -efl改为从file得到,屏敝 kill -9 $pid, 即可通过tty输出及日志文件观察到正确结果
请大家斧正.谢谢!
(如将此脚本加入crontab,时间自定,即可达到自动查杀超时或僵死的进程)

  1. #!/bin/ksh
  2. #自动查杀超时或僵死的进程的脚本   V050930
  3. #crontab -e  
  4. #0,5,10,15,20,25,30,40,45,50,55 * * * * /usr/bin/autokill.sh &  #设置为每5分钟检查一次超时进程
  5. #为了安全保险起见,此版脚本的清除范围为:由终端启动的,占用CUP时间超过指定时间长度的,非root用户的进程或僵尸进程  ^_^

  6. #检测参数
  7. killlog="/tmp/kill.log"    #默认自动清除超时进程或僵死进程的日志
  8. out=60                     # 默认的超时时间,以秒为单位,默认为60秒,范围为10秒--36000秒
  9. trap 'rm /tmp/kill.tmp 2>/dev/null' 0 1 2 3 9 15
  10. test $LOGNAME != root && { echo "Sorry ! 本 脚 本 只 能 由 root 操 作 !\n\n" ; exit 1 ; }
  11. test "$out" || { echo "\n  超时时限不能为空\n" ; exit 1 ; }
  12. test "$(echo $out | sed -n '/^[0-9][0-9]*$/p')" || { echo "\n  超时时限只能为整数值\n" ; exit 1 ; }
  13. test $out -ge 10 -a $out -le 36000 || { echo "\n  超时时限范围为10秒--36000秒\n" ; exit 1 ; }

  14. #查找超时或僵尸进程
  15. ps -efl |awk -v outtest=$out '{ outtime=timetest($14) }
  16. $2~/Z/ || ( $3!~/root/ && $13!~/\?/ && outtime=="outtime" ) \
  17. {print $3,$4,$13,$2,$14,$15 }
  18. function timetest(ot)
  19. {
  20. hour=substr(ot,1,2)
  21. min=substr(ot,4,2)
  22. sec=substr(ot,7,8)
  23. if ( hour*3600+min*60+sec > outtest)
  24. return "outtime"
  25. else
  26. return "good"
  27. } ' >/tmp/kill.tmp 2>/dev/null

  28. #保存清除列表
  29. if [ -s /tmp/kill.tmp ]
  30. then
  31. pass=0
  32. error=0
  33. echo "\n清 除 时 间:  "$(date +%y/%m/%d-%H:%M:%S)"\n" >> $killlog
  34. awk 'BEGIN{printf("%-8s%-8s%-8s%-7s%-10s%-30s\n"),"用户名","进程号","终端号","状态","占用时间","任务名"}
  35. { state=statetest($4) ; printf("%-8s%-8s%-8s%-7s%-10s%-30s\n"),$1,$2,$3,state,$5,$6} END{print "\n"}
  36. function statetest(test)
  37. {  
  38. if (test=="S") return "睡眠"
  39. if (test=="R") return "运行"
  40. if (test=="Z") return "僵尸"
  41. if (test=="O") return "不存在"
  42. if (test=="B") return "等待"
  43. if (test=="T") return "停止"
  44. if (test=="I") return "中间"
  45. }' /tmp/kill.tmp >> $killlog 2>/dev/null

  46. #清除进程
  47. for pid in $(awk '{print $2}' /tmp/kill.tmp |sort -rn)
  48. do
  49. kill -9 $pid  
  50. test $? -eq 0 && \
  51. { echo "自动清除进程 $pid 成功" | awk '{printf("\n%-14s%-10s%-4s"),$1,$2,$3}' ;
  52. echo "自动清除进程 $pid 成功"   | awk '{printf("%-14s%-10s%-4s\n"),$1,$2,$3}' \
  53. >> $killlog 2>/dev/null ;  pass=$((pass+1)) ; } || \
  54. { echo "自动清除进程 $pid 失败" | awk '{printf("\n%-14s%-10s%-4s"),$1,$2,$3}' ;
  55. echo "自动清除进程 $pid 失败"   | awk '{printf("%-14s%-10s%-4s\n"),$1,$2,$3}' \
  56. >> $killlog 2>/dev/null ; error=$((error+1)) ; }
  57. done

  58. #保存最终统计结果
  59. test $error -eq 0 && \
  60. { echo "此次共清除 ${pass} 个进程成功" | awk '{printf("\n\n%-14s%-4s%-10s\n\n"),$1,$2,$3}'
  61.   echo "此次共清除 ${pass} 个进程成功" | awk '{printf("\n%-14s%-4s%-10s\n\n"),$1,$2,$3}' \
  62. >> $killlog 2>/dev/null ; } || \
  63. { echo "此次共清除 ${pass} 个进程成功 ${error} 个进程失败" | \
  64. awk '{printf("\n\n%-14s%-4s%-16s%-10s%-10s\n\n"),$1,$2,$3,$4,$5}' ;
  65.   echo "此次共清除 ${pass} 个进程成功 ${error} 个进程失败" | \
  66. awk '{printf("\n\n%-14s%-4s%-16s%-10s%-10s\n\n"),$1,$2,$3,$4,$5}' >> $killlog 2>/dev/null ; }
  67. fi
复制代码

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
发表于 2005-10-01 11:00 |显示全部楼层

[原创自动查杀超时或僵死的进程的脚本

支持原创

论坛徽章:
0
发表于 2005-10-01 11:43 |显示全部楼层

[原创自动查杀超时或僵死的进程的脚本

nice script!

论坛徽章:
0
发表于 2005-10-01 11:52 |显示全部楼层

[原创自动查杀超时或僵死的进程的脚本

系统不是有一个命令是idle

论坛徽章:
0
发表于 2005-10-01 12:25 |显示全部楼层

[原创自动查杀超时或僵死的进程的脚本

下面是以前在坛里找到的脚本,只是感觉设置不太方便和不知道运行结果,就动手改进了一下。

  1. #!/bin/ksh
  2. #自动杀死UNIX僵死的进程
  3. ps -ef | awk '{ print $1,$2,$7,$8 }' | \
  4. awk '/[0-9][0-9]:[0-9][0-9]:[1-9][0-9]/ { print $1,$2,$3,$4 }' | \
  5. awk '!/root/ { print "kill -9 " $2}' > /tmp/k_kill
  6. chmod 777 /tmp/k_kill
  7. /tmp/k_kill
复制代码



sco unix505里没有idle这个命令,倒好像是有个系统参数,可以设置为终端N分钟无动作就outlogin的,和脚本实现的目的不同

论坛徽章:
0
发表于 2005-10-02 12:44 |显示全部楼层

[原创自动查杀超时或僵死的进程的脚本

最好不要一开始就用-9,先用-15,sleep个3,5秒在检测一下状态,如果杀不掉在-9

论坛徽章:
0
发表于 2005-10-02 15:06 |显示全部楼层

[原创自动查杀超时或僵死的进程的脚本

^_^. 指点的对,这样更安全。

  1. kill -15 $pid
  2. sleep 3
  3. test "$(ps -efl | awk '$4=='"$pid"' {print }') " || kill -9 $pid
复制代码

论坛徽章:
0
发表于 2005-10-03 09:38 |显示全部楼层

[原创自动查杀超时或僵死的进程的脚本

支持

论坛徽章:
0
发表于 2005-10-11 20:04 |显示全部楼层

[原创自动查杀超时或僵死的进程的脚本

论坛徽章:
0
发表于 2005-10-11 21:17 |显示全部楼层

[原创自动查杀超时或僵死的进程的脚本

是不是有idle命令不清楚了,偶的sco没找到这个命令
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP