当前位置:  技术问答>linux和unix

请教高手shell命令

    来源: 互联网  发布时间:2016-04-21

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

有时候前置机会出现死进程等,做了这个自动查杀的脚本,已在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 操 作 !nn" ; 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%-30sn"),"用户名","进程号","终端号","状态","占用时间","任务名"} 
{ state=statetest($4) ; printf("%-8s%-8s%-8s%-7s%-10s%-30sn"),$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%-4sn"),$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%-4sn"),$1,$2,$3}' 
>> $killlog 2>/dev/null ; error=$((error+1)) ; }
done
#保存最终统计结果
test $error -eq 0 && 
{ echo "此次共清除 ${pass} 个进程成功" | awk '{printf("nn%-14s%-4s%-10snn"),$1,$2,$3}'
  echo "此次共清除 ${pass} 个进程成功" | awk '{printf("n%-14s%-4s%-10snn"),$1,$2,$3}' 
>> $killlog 2>/dev/null ; } || 
{ echo "此次共清除 ${pass} 个进程成功 ${error} 个进程失败" | 
awk '{printf("nn%-14s%-4s%-16s%-10s%-10snn"),$1,$2,$3,$4,$5}' ; 
  echo "此次共清除 ${pass} 个进程成功 ${error} 个进程失败" | 
awk '{printf("nn%-14s%-4s%-16s%-10s%-10snn"),$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

------------------------------------------------------

请高手指点: 

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

这里的 test 是什么意思呀?

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

这里 akw 是干什么作用呀?

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

我知道 | 是管道, 那么 || 是不是 或 的意思呀?

|
A || B; 就是如果A为flase,那将会执行B。如果A为true,那就不执行B了。

    
 
 

您可能感兴趣的文章:

  • 请教unix常用命令命令问题
  • 请教:AIX命令中的procstack的命令显示的tid是线程ID吗
  • 请教:使用system(命令)或者exec(命令)启动一个进程执行命令,如何判断这个命令是否启动成功或正在运行?
  • 请教unix操作命令
  • 请教!Ubuntu下怎样在命令行下打开html文档啊?
  • 请教一下info命令是作什么用的?怎么用?
  • 请教redhat9下什么命令执行arp解析和逆向arp解析
  • 请教wget命令行的使用
  • 请教:使用什么命令查看导出的环境变量?
  • 请教一个命令行的使用
  • 散完全部分请教:linux下面有没有类似windows下面rasdial的命令
  • 请教iptables命令一则:如何封调一个ip地址30分钟
  • 请教::linux有没有命令可以做Ctrl+Z??
  • 请教各位老鸟,DOS下用什么命令可以看系统的配置信息??
  • 请教linux命令行的解析过程是怎样的
  • 请教FreeBSD下的Vi在命令模式下的编辑问题
  • 急!请教两个命令(操作目录)
  • 请教iproute命令的使用
  • 请教查看某个特定进程内存消耗情况的命令,急!
  • 请教:UNIX命令前加表示什么意思呢
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教,请教,这个问题是为什么???? iis7站长之家
  • 请教高手lvs的奇怪问题,我挺着急,希望高手别潜水,就就我,先谢谢了
  • 请教高手:如何用gnome/gtk编写托盘程序
  • 请教各位高手一个简单的问题:在JAVA 中如何才能取得一些系统信息?
  • 请教curses的高手
  • #######菜鸟问题,请教高手,一定给分########
  • 如何在Linux上使用LoadLibrary()?高手请教!
  • 请教:Java高手读书之路
  • 请教高手:cpu占用经常100%怎么解决?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教,请教,这个问题是为什么????
  • 请教本地硬盘安装问题请教本地硬盘安装问题
  • ■请教■请教redhat最基本的问题!
  • 请教一个 shell 问题,我用下面这个 shell 语句总是失败,请教
  • 请教Linux下pgadmin3-1.0.2的编译和安装!!高分请教!
  • 各位大虾,请教装了REDHAT9操作系统后,启动时无法引导到LINUX,请教该如何解决啊
  • 请教,请教,,,一定要看!!一定要看!!
  • 请教象我这样的硬盘应如何安装Linux,我昨天试装了,但有问题。(老问题了,也看了前面的帖子,但还是来请教,请多指教)
  • 请教这种循环的执行过程
  • 请教两个redhat9问题
  • 请教如何在指定目录下查找包含指定文字的文件
  • 请教局域网中如何通过ip地址得到主机名
  • 请教kdevelop的问题
  • 请教linux 下的adsl拨号问题.
  • 请教,如何用虚拟订机安装liux
  • 【请教】LINUX 下SNMP的MIB开发
  • 请教一个opengl的问题
  • 请教两个shell
  • 菜鸟请教Linux
  • 请教semop()函数的用法、含义


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3