- 论坛徽章:
- 0
|
近来,一台业务服务器进程经常出现异常:进程是存在的,但不能服务请求。而且正常情况下会不断的写日志到一个文件,当异常时日志也没有了。
根据这个情况,自己写了一个脚本,主要原理是:判断日志文件是否在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 编辑 ] |
|