免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 42349 | 回复: 29
打印 上一主题 下一主题

根据日志文件监控进程(已初步解决,附named-nanny.pl供各位参考) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-28 10:06 |显示全部楼层 |倒序浏览
近来,一台业务服务器进程经常出现异常:进程是存在的,但不能服务请求。而且正常情况下会不断的写日志到一个文件,当异常时日志也没有了。


根据这个情况,自己写了一个脚本,主要原理是:判断日志文件是否在1分钟内变化,如果没有变化说明进程异常并重启进程。

如下是代码,还没放在正式机器上跑,请各位指教是否可行,哪里需要改进,谢谢!

use strict;

$ENV{'LD_LIBRARY_PATH'}="../commonlib:/ldap/ds5/lib:/usr/local/mysql/lib/mysql:/usr/local/ssl/lib:/usr/lib:/usr/ucblib";    #设置环境变量


for (;;) {
        my $char=`ls -lh /logs/log.dat`;   

        #格式如:-rw-r--r--   1 gc     other       529K  5月 28日 09:55 /logs/log.dat
        my @list=split /\s+/,$char;
        my $date_m1=$list[5] . $list[6] . $list[7];
        sleep 61;
        my $char2=`ls -lh /logs/log.dat`;
        my @list2=split /\s+/,$char2;
        my $date_m2=$list2[5] . $list2[6] . $list2[7];
        goto restart if ($date_m1 eq $date_m2);       #如果被修改时间相等,就说明没有写日志,则重启
        next;
restart:
        my $pro=`ps -ef | grep -i "Service" | grep -v grep | wc -l`;
        if ($pro==1) {
                my $pro2=`ps -ef | grep -i “Service" | grep -v grep`;
                my @list3=split /\s+/,$pro2;
                my $pid=$list3[2];
                system ("kill -9 $pid");
                chomp (my $date=`date`);
                open FILE,">>/export/home/g/log";
                printf FILE "$date restart(pid alive)\n";
                close FILE;
                chdir "/bin/" or die "$1";
                system ("./Service");
        } else {
                chomp (my $date2=`date`);
                open FILE,">>/export/home/g/log";
                printf FILE "$date2 restart(no pid)\n";
                close FILE;
                chdir "/bin/" or die "$1";
                system ("./Service");
        }
}



[ 本帖最后由 gaochong 于 2009-6-11 13:29 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-05-28 11:33 |显示全部楼层

回复 #2 churchmice 的帖子

是的,我在看stat和lstat函数。谢谢!
我想,用stat函数还可以减少sleep时间,也就是业务影响时间降低。

请问还有其他需要改进的地方吗?

论坛徽章:
0
3 [报告]
发表于 2009-05-28 11:54 |显示全部楼层
原帖由 churchmice 于 2009-5-28 11:13 发表
perl里面有stat函数的



经修改过的代码如下:请各位指教是否可行,哪里需要改进。谢谢!


#!/usr/bin/perl -w
use strict;

$ENV{'LD_LIBRARY_PATH'}="../commonlib:/ldap/ds5/lib:/usr/local/mysql/lib/mysql:/usr/local/ssl/lib:/usr/lib:/usr/ucblib";    #设置环境变量

my $file="/logs/log.dat";

for (;;) {

        my $mtime1=localtime ((stat($file))[9]);
        sleep 5;
        my $mtime2=localtime ((stat($file))[9]);
        goto restart if ($date_m1 eq $date_m2);   #如果mtime5秒后没变化就说明没有写日志,则重启
        next;
restart:
        my $pro=`ps -ef | grep -i "Service" | grep -v grep | wc -l`;
        if ($pro==1) {
                my $pro2=`ps -ef | grep -i “Service" | grep -v grep`;
                my @list3=split /\s+/,$pro2;
                my $pid=$list3[2];
                system ("kill -9 $pid");
                chomp (my $date=`date`);
                open FILE,">>/export/home/g/log";
                printf FILE "$date restart(pid alive)\n";
                close FILE;
                chdir "/bin/" or die "$1";
                system ("./Service");
        } else {
                chomp (my $date2=`date`);
                open FILE,">>/export/home/g/log";
                printf FILE "$date2 restart(no pid)\n";
                close FILE;
                chdir "/bin/" or die "$1";
                system ("./Service");
        }
}




[ 本帖最后由 gaochong 于 2009-5-28 11:58 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-05-28 15:31 |显示全部楼层

回复 #4 gaochong 的帖子

1.是否要设置环境变量
2.system函数的用法对不对,比如kill -9 pid
3.是否要用到fork,还不太会。

论坛徽章:
0
5 [报告]
发表于 2009-05-29 13:18 |显示全部楼层
还请各位指教。。

论坛徽章:
0
6 [报告]
发表于 2009-05-29 21:00 |显示全部楼层

回复 #6 gaochong 的帖子

#!/usr/bin/perl -w

use strict;

$ENV{'LD_LIBRARY_PATH'}="../commonlib:/ldap/ds5/lib:/usr/local/mysql/lib/mysql:/usr/local/ssl/lib:/usr/lib:/usr/ucblib";    #设置环境变量


my $file="/logs/log.dat";

for (;;) {
        my $mtime1=localtime ((stat($file))[9]);
        sleep 5;
        my $mtime2=localtime ((stat($file))[9]);
        goto restart if ($mtime1 eq $mtime2);   #如果mtime5秒后没变化就说明没有写日志,则重启
        next;
restart:
        my $pro=`ps -ef | grep -i "Service" | grep -v grep | wc -l`;
        if ($pro==1) {
                my $pro2=`ps -ef | grep -i “Service" | grep -v grep`;
                my @list3=split /\s+/,$pro2;
                my $pid=$list3[2];
                system ("
kill -9 $pid");
                chomp (my $date=`date`);
                open FILE,"
>>/export/home/g/log";
                printf FILE "
$date restart(pid alive)\n";
                close FILE;
                chdir "
/bin/" or die "$1";
                system ("
./Service");
        } else {
                chomp (my $date2=`date`);
                open FILE,"
>>/export/home/g/log";
                printf FILE "
$date2 restart(no pid)\n";
                close FILE;
                chdir "
/bin/" or die "$1";
                system ("
./Service




以后代码的效率有问题。不知为什么,程序跑2个小时就丢了,不知道为什么。
请各位老大帮忙看看,谢谢各位了!

[ 本帖最后由 gaochong 于 2009-5-29 21:10 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-05-29 21:35 |显示全部楼层
原帖由 DQP 于 2009-5-29 21:31 发表
跑丢了指的是什么呢?




就是这个进程没有了。

我是用 ./check.pl & 执行的。

[ 本帖最后由 gaochong 于 2009-5-29 21:37 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2009-05-29 23:00 |显示全部楼层
不到2小时perl进程就丢失了。请问是什么原因呢?如何解决?谢谢。

论坛徽章:
0
9 [报告]
发表于 2009-05-30 09:41 |显示全部楼层

回复 #10 gaochong 的帖子

怎么没人呢?
各位大师帮忙看看,谢谢啦

论坛徽章:
0
10 [报告]
发表于 2009-05-30 11:19 |显示全部楼层
原帖由 xuanfei 于 2009-5-30 10:16 发表


细心区别 PID PPID :wink: 别乱Kill 迟早会出事的!
BTW:你很喜欢用goto吗:lol::" />:" />



我把goto改成if语句了,如下:

#!/usr/bin/perl -w


use strict;

$ENV{'LD_LIBRARY_PATH'}="../commonlib:/ldap/ds5/lib:/usr/local/mysql/lib/mysql:/usr/local/ssl/lib:/usr/lib:/usr/ucblib";    #设置环境变量

my $file="/logs/log.dat";

for (;;) {
        my $mtime1=localtime ((stat($file))[9]);
        print "$mtime1\n";
        sleep 5;
        my $mtime2=localtime ((stat($file))[9]);
        print "$mtime2\n";
        if ($mtime1 eq $mtime2) {        #如果被修改时间相等,则执行。这是为了测试,见后边执行结果
                 chomp (my $proc=`ps -ef | grep -i "ua_aaaService -r -l -b -f ../conf/config.xml" | grep -v grep | wc -l`);
                if ($proc==1) {
                          foreach (`ps -ef | grep -i "ua_aaaService -r -l -b -f ../conf/config.xml" | grep -v grep`) {
                        print $_;
                        my($pid)=/\s+\S+\s+(\S+)\s+.*/;
                        print "$pid\n";
                        #system ("kill -9 $pid");               #测试用,注释掉
                        chomp (my $date=`date`);
                        open FILE,">>/export/home/g/log"
                                or die "$!";
                        printf FILE "$date restart-radius(pid alive)\n";
                        close FILE;
                        chdir "/export/home/boss/ua/bin/" or die "$1";
                        #system ("./ua_aaaService -r -l -b -f ../conf/config.xml");
                        }
                } elsif ($proc==0) {
                        print "no pid\n";
                        chomp (my $date2=`date`);
                        open FILE,">>/export/home/g/log"
                                or die "$!";
                        printf FILE "$date2 restart-radius(no pid)\n";
                        close FILE;
                        chdir "/export/home/boss/ua/bin/" or die "$1";
                        #system ("./ua_aaaService -r -l -b -f ../conf/config.xml");
                } else {};
             }

        }
next;
}



程序中的pid是对的。目前的情况是进程存在但不能服务请求,所以要kill否则怎么办呢?

测试用的执行结果如下:
-bash-3.00$ ./check.pl
Thu May 28 18:38:28 2009
Thu May 28 18:38:28 2009
    g 23231     1   0   5月 28 ?           0:04 ./ua_aaaService -r -l -b -f ../conf/config.xml
23231
Thu May 28 18:38:28 2009
Thu May 28 18:38:28 2009
    g 23231     1   0   5月 28 ?           0:04 ./ua_aaaService -r -l -b -f ../conf/config.xml
23231
Thu May 28 18:38:28 2009
Thu May 28 18:38:28 2009
    g 23231     1   0   5月 28 ?           0:04 ./ua_aaaService -r -l -b -f ../conf/config.xml
23231
Thu May 28 18:38:28 2009


[ 本帖最后由 gaochong 于 2009-5-30 12:30 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP