Интерпрайз. суровый и беспощадный

Sep 15, 2010 09:15

вызывается как
*/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__

fun, креатив

Previous post Next post
Up