#!/usr/bin/perl

=head1 NAME

    kill-hanged-apaches - убить зависшие апачи на сервере

=head1 DESCRIPTION

    Скрипт принимает один параметр командной строки - порт и
    делает запрос к localhost:PORT.
    Парсит ответ, находит зависшие процессы и убивает их.

=cut

use strict;
use warnings;

use LWP::Simple;
use Data::Dumper;

if (@ARGV != 1 || $ARGV[0] !~ /^\d+$/ || $ARGV[0] > 65535) {
    die "Usage: $0 local-port\n"
}
my ($PORT) = @ARGV;

my $url = "http://localhost:$PORT/server-status";
my $cont = get($url);
if (!defined $cont) {
    die "Can't get $url";
}
$cont =~ s/\s//g;

# выделяем tr-ы
my @trs = $cont =~ m!<tr>(.*?)</tr>!g;

# каждый tr бъём по td
my @tds = map {[map {s/<[^>]*>//g; $_} split /<td[^>]*>/]} @trs;

# находим зависшие процессы
my @hanged_processes = grep {
        # в строке нужное число полей
        @$_==14
        # процесс в состоянии Gracefull restart
        && $_->[4] eq "G"
        # последний запрос обрабатывался более 10 минут назад
        && $_->[6] > 600
    } @tds;

# выделяем пиды повисших процессов
my @hanged_pids = map {$_->[2]} @hanged_processes;

# убиваем их
if (@hanged_pids) {
    kill 9 => @hanged_pids;
}

