вызывается как
*/10 * * * * /site/scripts/utils/system_checker.pl >/site/scripts/utils/log.log 2>&1
#!/usr/bin/perl
# Rico
# Эта утилитка палит баг с большим количеством httpd в системе
# рестартит апач, запрашивает через lwp сайт, и если у нас 502 или 504
# рестартит нигинкс и апач.
use strict;
use warnings;
use Fcntl qw(:flock);
use LWP;
use OurProject::Devel;
if (! flock (DATA, LOCK_EX|LOCK_NB) ) {
exit(0);
};
# Оцениваем количество чилдов апача
open (my $fh, "-|", "ps xa | grep httpd") or die "Cant $!\n";
my @res = grep {$_=~/-F/} <$fh>;
close $fh;
# рестартим при необходимости апач
if (scalar @res > 45) {
# проверим. какие процессы перла висят в системе в этот момент:
open (my $fh, "-|", "ps xa | grep perl") or die "Cant $!\n";
my $perl = join('',<$fh>);
close $fh;
if (system("/usr/local/bin/svc -t /var/service/apache")) {
OurProject::Devel->send_mail(
'email1',
'system_checker: apache NOT restart',
"Апач не смог перезапустить.\n"."Число чилдов апача в системе: ".$#res.
"\n--\nПерл процессы в этот момент:\n$perl"
);
OurProject::Devel->send_mail(
'email2',
'system_checker: apache NOT restart',
"Апач не смог перезапустить.\n"."Число чилдов апача в системе: ".$#res.
"\n--\nПерл процессы в этот момент:\n$perl"
);
exit(0);
} else {
sleep(2);
system("pkill -f httpd");
OurProject::Devel->send_mail(
'email1',
'system_checker: apache restart',
"Апач был перезапущен.\n"."Число чилдов апача в системе: ".$#res.
"\n--\nПерл процессы в этот момент:\n$perl"
);
OurProject::Devel->send_mail(
'email2',
'system_checker: apache restart',
"Апач был перезапущен.\n"."Число чилдов апача в системе: ".$#res.
"\n--\nПерл процессы в этот момент:\n$perl"
);
sleep(20);
}
};
# пробуем постучаться на апач через LWP
my $ua = LWP::UserAgent->new();
$ua->agent('Rico 1.0');
$ua->timeout(40);
my $res = $ua->get('
http://OurProject.ru/');
(my $code = $res->code) =~ s/\D//g;
if ($code>499 and $code<505) {
# нигинкс упал
if (system("/usr/local/etc/rc.d/nginx.sh restart")) {
OurProject::Devel->send_mail(
'email1',
'system_checker: nginx NOT restart',
"Нгинкс не смог перезапустить.\n"."Код возврата LWP: ".$code.
"\n--\nПодробно:\n".$res->as_string
);
OurProject::Devel->send_mail(
'email2',
'system_checker: nginx NOT restart',
"Нгинкс не смог перезапустить.\n"."Код возврата LWP: ".$code.
"\n--\nПодробно:\n".$res->as_string
);
exit(0);
} else {
system("/usr/local/bin/svc -t /var/service/apache");
sleep(2);
system("pkill -f httpd");
OurProject::Devel->send_mail(
'email1',
'system_checker: nginx restart',
"Нгинкс и апач был перезапущен.\n"."Код возврата LWP: ".$code.
"\n--\nПодробно:\n".$res->as_string
);
OurProject::Devel->send_mail(
'email2',
'system_checker: nginx restart',
"Нгинкс и апач был перезапущен.\n"."Код возврата LWP: ".$code.
"\n--\nПодробно:\n".$res->as_string
);
sleep(10);
}
} elsif ($code ne '200') {
OurProject::Devel->send_mail(
'email1',
'system_checker: йопт',
"Хуй знает что случилось, но\n"."код возврата LWP: ".$code.
"\n--\nПодробно:\n".$res->as_string
);
OurProject::Devel->send_mail(
'email2',
'system_checker: йопт',
"Хуй знает что случилось, но\n"."код возврата LWP: ".$code.
"\n--\nПодробно:\n".$res->as_string
);
}
undef $res;
exit(0);
__DATA__