免费注册 查看新帖 |

Chinaunix

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

根据日志文件监控进程(已初步解决,附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:13 |只看该作者
perl里面有stat函数的

论坛徽章:
0
3 [报告]
发表于 2009-05-28 11:33 |只看该作者

回复 #2 churchmice 的帖子

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

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

论坛徽章:
0
4 [报告]
发表于 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
5 [报告]
发表于 2009-05-28 15:31 |只看该作者

回复 #4 gaochong 的帖子

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

论坛徽章:
0
6 [报告]
发表于 2009-05-29 13:18 |只看该作者
还请各位指教。。

论坛徽章:
0
7 [报告]
发表于 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
8 [报告]
发表于 2009-05-29 21:31 |只看该作者

回复 #7 gaochong 的帖子

跑丢了指的是什么呢?

论坛徽章:
0
9 [报告]
发表于 2009-05-29 21:35 |只看该作者
原帖由 DQP 于 2009-5-29 21:31 发表
跑丢了指的是什么呢?




就是这个进程没有了。

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

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

论坛徽章:
0
10 [报告]
发表于 2009-05-29 23:00 |只看该作者
不到2小时perl进程就丢失了。请问是什么原因呢?如何解决?谢谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP