Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2122599
  • 博文数量: 374
  • 博客积分: 7276
  • 博客等级: 少将
  • 技术积分: 5668
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-06 16:35
文章分类

全部博文(374)

文章存档

2013年(23)

2012年(153)

2011年(198)

分类: LINUX

2012-05-16 10:06:52

假定需要实现重启的程序名为 test ,我们这里通过判断进程数目来判断程序是否正常。

ps -ef | grep "$1" | grep -v "grep" | wc –l 是获取 $1 (本例中为 test )的进程数,脚本根据进程数来决定下一步的操作。通过一个死循环,每隔 1 秒检查一次系统中的指定程序的进程数。


grep -v "grep":作用:在结果中搜索除 grep之外的部分 
-v, --invert-match
              Invert the sense of matching, to select non-matching lines.  (-v is specified by POSIX.)

代码如下:
    脚本check


#!/bin/sh
                
#------------------------------------------------------------------------------
# 函数: CheckProcess
# 功能: 检查一个进程是否存在
# 参数: $1 --- 要检查的进程名称
# 返回: 如果存在返回0, 否则返回1.
#------------------------------------------------------------------------------
        CheckProcess(){ 
# 检查输入的参数是否有效 
        if [ "$1" = "" ]; 
        then   
           return 1 
        fi   
#$PROCESS_NUM获取指定进程名的数目,为1返回0,表示正常,不为1返回1,表示有错误,需要重新启动 
        PROCESS_NUM=`ps -ef | grep "$1" | grep -v "grep" | wc -l`  
        if [ $PROCESS_NUM -eq 1 ]; 
        then   
           return 0 
        else   
           return 1 
        fi
        }
                
# 检查test实例是否已经存在
  while [ 1 ] ; do
  CheckProcess $1
  CheckQQ_RET=$?
  if [ $CheckQQ_RET -eq 1 ];
  then
  # 杀死所有test进程,可换任意你需要执行的操作
   killall -9 $1
   exec ./$1 &
  fi
  sleep 1
  done
   脚本start:
 
 脚本start:
    加入limit coredumpsize 102400,设置core file的大小,一旦程序Core Dump,有迹可寻。在该脚本中后台执行check脚本,可以省去很多麻烦,


PS:对这个脚本的功能 表示怀疑 可能达不到实际需要的效果

经过实际验证后的可行的脚本如下:

#!/bin/sh

#declare -i g_processID=0

help(){
    echo "Usage: $0 "
    exit 0
}

# 参数范围检查
if [ "$#" != 1 ];
then  
    help
fi  

#检查进程实例是否已经存在
while [ 1 ]; do

    DTTERM=`pgrep ${1}`    
    if [ -n "$DTTERM" ]
    then 
        echo "process exit and date is: `date`"
#正确输入信息到日志文件
    else
        echo "restart process: $1 and date is: `date`"
        exec ./${1} &
    fi
#监控时间间隔
    sleep 1                       
done



附grep使用方法:

中的grep命令可以在文本中搜索指定的字符串,

摘要

举例介绍GREP的各种搜索方式,文件名,段落,正则匹配等多种方式的搜索.

假设您正在‘/usr/src/linux/Documentation’目录下搜索带字符串‘magic’的文件:

$ grep magic /usr/src//Documentation/*
sysrq.txt:* How do I enable the magic SysRQ key?
sysrq.txt:* How do I use the magic SysRQ key?

其中文件‘sysrp.txt’包含该字符串,讨论的是 SysRQ 的功能。

默认情况下,‘grep’只搜索当前目录。如果此目录下有许多子目录,‘grep’会以如下形式列出:

grep: sound: Is a directory

这可能会使‘’的输出难于阅读。这里有两种解决的办法:

明确要求搜索子目录:grep -r
或忽略子目录:grep -d skip
当然,如果预料到有许多输出,您可以通过 管道 将其转到‘less’上阅读:

$ grep magic /usr/src/linux/Documentation/* | less

这样,您就可以更方便地阅读。

有一点要注意,您必需提供一个文件过滤方式(搜索全部文件的话用 *)。如果您忘了,‘grep’会一直等着,直到该程序被中断。如果您遇到了这样的情况,按 ,然后再试。

下面是一些有意思的命令行参数:

grep -i pattern files :不区分大小写地搜索。默认情况区分大小写,
grep -l pattern files :只列出匹配的文件名,
grep -L pattern files :列出不匹配的文件名,
grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配‘magic’,而不是‘magical’),
grep -C number pattern files :匹配的上下文分别显示[number]行,
grep pattern1 | pattern2 files :显示匹配 pattern1 或 pattern2 的行,
grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行。
这里还有些用于搜索的特殊符号:

\< 和 \> 分别标注单词的开始与结尾。
例如:
grep man * 会匹配 ‘Batman’、‘manic’、‘man’等,
grep ‘\ grep ‘\’ 只匹配‘man’,而不是‘Batman’或‘manic’等其他的字符串。
‘^’:指匹配的字符串在行首,
‘$’:指匹配的字符串在行尾,

阅读(9925) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~