自动清理mysql的lock进程的脚本_自动查杀超时或僵死的进程的脚本

有时候前置机会出现死进程等,做了这个自动查杀的脚本,已在sco unix505中测试通过,如想测试,可ps -efl >file ,自行修改file里的进程状态及占用时间,再将脚本的输入源由ps -efl改为从file得到,屏敝 kill -9 $pid, 即可通过tty输出及日志文件观察到正确结果

请大家斧正.谢谢!

(如将此脚本加入crontab,时间自定,即可达到自动查杀超时或僵死的进程)

CODE:[Copy to clipboard]#!/bin/ksh

#自动查杀超时或僵死的进程的脚本   V050930

#crontab -e

#0,5,10,15,20,25,30,40,45,50,55 * * * * /usr/bin/autokill.sh &  #设置为每5分钟检查一次超时进程

#为了安全保险起见,此版脚本的清除范围为:由终端启动的,占用CUP时间超过指定时间长度的,非root用户的进程或僵尸进程  ^_^

#检测参数

killlog="/tmp/kill.log"    #默认自动清除超时进程或僵死进程的日志

out=60                     # 默认的超时时间,以秒为单位,默认为60秒,范围为10秒--36000秒

trap 'rm /tmp/kill.tmp 2>/dev/null' 0 1 2 3 9 15

test $LOGNAME != root && { echo "Sorry ! 本 脚 本 只 能 由 root 操 作 !\n\n" ; exit 1 ; }

test "$out" || { echo "\n  超时时限不能为空\n" ; exit 1 ; }

test "$(echo $out | sed -n '/^[0-9][0-9]*$/p')" || { echo "\n  超时时限只能为整数值\n" ; exit 1 ; }

test $out -ge 10 -a $out -le 36000 || { echo "\n  超时时限范围为10秒--36000秒\n" ; exit 1 ; }

#查找超时或僵尸进程

ps -efl |awk -v outtest=$out '{ outtime=timetest($14) }

$2~/Z/ || ( $3!~/root/ && $13!~/\?/ && outtime=="outtime" ) \

{print $3,$4,$13,$2,$14,$15 }

function timetest(ot)

{

hour=substr(ot,1,2)

min=substr(ot,4,2)

sec=substr(ot,7,8)

if ( hour*3600+min*60+sec > outtest)

return "outtime"

else

return "good"

} ' >/tmp/kill.tmp 2>/dev/null

#保存清除列表

if [ -s /tmp/kill.tmp ]

then

pass=0

error=0

echo "\n清 除 时 间:  "$(date +%y/%m/%d-%H:%M:%S)"\n" >> $killlog

awk 'BEGIN{printf("%-8s%-8s%-8s%-7s%-10s%-30s\n"),"用户名","进程号","终端号","状态","占用时间","任务名"}

{ state=statetest($4) ; printf("%-8s%-8s%-8s%-7s%-10s%-30s\n"),$1,$2,$3,state,$5,$6} END{print "\n"}

function statetest(test)

{

if (test=="S") return "睡眠"

if (test=="R") return "运行"

if (test=="Z") return "僵尸"

if (test=="O") return "不存在"

if (test=="B") return "等待"

if (test=="T") return "停止"

if (test=="I") return "中间"

}' /tmp/kill.tmp >> $killlog 2>/dev/null

#清除进程

for pid in $(awk '{print $2}' /tmp/kill.tmp |sort -rn)

do

kill -9 $pid

test $? -eq 0 && \

{ echo "自动清除进程 $pid 成功" | awk '{printf("\n%-14s%-10s%-4s"),$1,$2,$3}' ;

echo "自动清除进程 $pid 成功"   | awk '{printf("%-14s%-10s%-4s\n"),$1,$2,$3}' \

>> $killlog 2>/dev/null ;  pass=$((pass+1)) ; } || \

{ echo "自动清除进程 $pid 失败" | awk '{printf("\n%-14s%-10s%-4s"),$1,$2,$3}' ;

echo "自动清除进程 $pid 失败"   | awk '{printf("%-14s%-10s%-4s\n"),$1,$2,$3}' \

>> $killlog 2>/dev/null ; error=$((error+1)) ; }

done

#保存最终统计结果

test $error -eq 0 && \

{ echo "此次共清除 ${pass} 个进程成功" | awk '{printf("\n\n%-14s%-4s%-10s\n\n"),$1,$2,$3}'

echo "此次共清除 ${pass} 个进程成功" | awk '{printf("\n%-14s%-4s%-10s\n\n"),$1,$2,$3}' \

>> $killlog 2>/dev/null ; } || \

{ echo "此次共清除 ${pass} 个进程成功 ${error} 个进程失败" | \

awk '{printf("\n\n%-14s%-4s%-16s%-10s%-10s\n\n"),$1,$2,$3,$4,$5}' ;

echo "此次共清除 ${pass} 个进程成功 ${error} 个进程失败" | \

awk '{printf("\n\n%-14s%-4s%-16s%-10s%-10s\n\n"),$1,$2,$3,$4,$5}' >> $killlog 2>/dev/null ; }

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

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

CODE:[Copy to clipboard]kill -15 $pid

sleep 3

test "$(ps -efl | awk '$4=='"$pid"' {print }') " || kill -9 $pid

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值