Собсно сабж. Как с этим бороться? Чаще всего такое происходит ночью, когда на серваке smb шары ставятся на проверку антивирусником. А по крону каждые 5 минут отрабатываются критичные процессы.
"Вылетают" четыре процесса. И если пару я могу отключить от мониторинга, то остальная пара взаимосвязана. Согласно модуля, "вылетают":natd
pop3d
asterisk
mpg123ВОт собственно код:
#!/usr/bin/perl -w
use strict;
use warnings;
use lib "/usr/local/scripts/lib/";
use lib "/usr/local/script/lib/";
use skmainmod;
use Sys::Hostname;
use Proc::ProcessTable;my @etc = ('/etc/FS/','/usr/local/etc/chk/',
'/usr/chk/etc/','/usr/chk/etc/',
'/usr/local/chk/etc/',
'/usr/script/chk/etc/',
'/usr/scripts/chk/etc/',
'/usr/local/script/chk/etc/',
'/usr/local/scripts/chk/etc/');my $etc_file = 'cryt_proc.conf';
my @log = ('/usr/local/script/chk/log/',
'/usr/local/scripts/chk/log/',
'/usr/script/chk/log/',
'/usr/scripts/chk/log/',
'/usr/local/var/log/chk/',
'/usr/var/log/chk/',
'/var/log/chk/',
'/var/log/');my %argv = skmainmod->argum_read(@ARGV);
my $conf_file = $argv{'conf'} || skmainmod->chk_file($etc_file,@etc) || die "No found config file!\nExit!\n";my %conf = skmainmod->read_config($conf_file);
my $table = new Proc::ProcessTable;
my @proc_arr = ();
foreach my $process (@{$table->table}) {
my $res = 0;
#print "--------------------------------\n";
#print $process->fname, "\n";
foreach my $tbl (@proc_arr){
if ($tbl eq $process->fname) {
$res++;
}
}
if ($res <1) {
push @proc_arr, $process->fname;
}}
my @sort_arr = sort @proc_arr;
@proc_arr = ();
@proc_arr = @sort_arr;
@sort_arr = ();my $cryt_proc = $conf{'crytical_process'};
$cryt_proc =~ s/[\s\t++]//g;
my @report_mail;
my $mail_send = 0;
foreach my $chk (sort(split(/\,/,$cryt_proc))){
my $res =0;
my $report = "Crytical process: $chk --->";
foreach my $pr (@proc_arr){
# print "$pr\n";
if ($pr eq $chk) {
$res++;
}
}
if ($res < 1) {
$report = "$report is down. Warning!!!\n";
$mail_send++;
&send_report('sms',$chk,'down');
}
else {
$report = "$report is active.\n";
}
push @report_mail,$report;
}if ($mail_send > 0){
&send_report('mail',@report_mail);
}exit(0);
Соотвественно на выходе в почту и на sms получаю:DATE of REPORT: 05:00:06 27.03.2006
HOST: k.com.ua
Crytical process: asterisk ---> is down. Warning!!!
Crytical process: httpd ---> is active.
Crytical process: master ---> is active.
Crytical process: mpg123 ---> is down. Warning!!!
Crytical process: mysqld ---> is active.
Crytical process: pptpd ---> is active.
Crytical process: radiusd ---> is active.
Crytical process: smbd ---> is active.
Crytical process: squid ---> is active.
Crytical process: sshd ---> is active.
Crytical process: vtund ---> is active.
В общем проверка показывает, что процесс живой и никуда не девался, а скрипт рапортует, что уходит в даун. Тоесть, есть подозрения, что виной имено модуль Proc::ProcessTable... В чем может быть проблема? Никто не сталкивался с подобным?
>Собсно сабж. Как с этим бороться? Чаще всего такое происходит ночью, когда
>на серваке smb шары ставятся на проверку антивирусником. А по крону
>каждые 5 минут отрабатываются критичные процессы.
>"Вылетают" четыре процесса. И если пару я могу отключить от мониторинга, то
>остальная пара взаимосвязана. Согласно модуля, "вылетают":
>
>natd
>pop3d
>asterisk
>mpg123
>
>ВОт собственно код:
>
>#!/usr/bin/perl -w
>use strict;
>use warnings;
>use lib "/usr/local/scripts/lib/";
>use lib "/usr/local/script/lib/";
>use skmainmod;
>use Sys::Hostname;
>use Proc::ProcessTable;
>
>my @etc = ('/etc/FS/','/usr/local/etc/chk/',
>
> '/usr/chk/etc/','/usr/chk/etc/',
>
> '/usr/local/chk/etc/',
>
> '/usr/script/chk/etc/',
>
> '/usr/scripts/chk/etc/',
>
> '/usr/local/script/chk/etc/',
>
> '/usr/local/scripts/chk/etc/');
>
>my $etc_file = 'cryt_proc.conf';
>
>my @log = ('/usr/local/script/chk/log/',
> '/usr/local/scripts/chk/log/',
> '/usr/script/chk/log/',
> '/usr/scripts/chk/log/',
> '/usr/local/var/log/chk/',
> '/usr/var/log/chk/',
> '/var/log/chk/',
> '/var/log/');
>
>my %argv = skmainmod->argum_read(@ARGV);
>my $conf_file = $argv{'conf'} || skmainmod->chk_file($etc_file,@etc) || die "No found config file!\nExit!\n";
>
>my %conf = skmainmod->read_config($conf_file);
>
>my $table = new Proc::ProcessTable;
>my @proc_arr = ();
>foreach my $process (@{$table->table}) {
> my $res = 0;
> #print "--------------------------------\n";
> #print $process->fname, "\n";
> foreach my $tbl (@proc_arr){
> if ($tbl eq $process->fname) {
> $res++;
> }
> }
> if ($res <1) {
> push @proc_arr, $process->fname;
> }
>
>}
>
>my @sort_arr = sort @proc_arr;
>@proc_arr = ();
>@proc_arr = @sort_arr;
>@sort_arr = ();
>
>my $cryt_proc = $conf{'crytical_process'};
>$cryt_proc =~ s/[\s\t++]//g;
>my @report_mail;
>my $mail_send = 0;
>foreach my $chk (sort(split(/\,/,$cryt_proc))){
> my $res =0;
> my $report = "Crytical process: $chk --->";
> foreach my $pr (@proc_arr){
> # print "$pr\n";
> if ($pr eq $chk) {
> $res++;
> }
> }
> if ($res < 1) {
> $report = "$report is down. Warning!!!\n";
> $mail_send++;
> &send_report('sms',$chk,'down');
> }
> else {
> $report = "$report is active.\n";
> }
> push @report_mail,$report;
>
>}
>
>if ($mail_send > 0){
> &send_report('mail',@report_mail);
>}
>
>exit(0);
>
>
>Соотвественно на выходе в почту и на sms получаю:
>
>DATE of REPORT: 05:00:06 27.03.2006
>HOST: k.com.ua
>Crytical process: asterisk ---> is down. Warning!!!
>Crytical process: httpd ---> is active.
>Crytical process: master ---> is active.
>Crytical process: mpg123 ---> is down. Warning!!!
>Crytical process: mysqld ---> is active.
>Crytical process: pptpd ---> is active.
>Crytical process: radiusd ---> is active.
>Crytical process: smbd ---> is active.
>Crytical process: squid ---> is active.
>Crytical process: sshd ---> is active.
>Crytical process: vtund ---> is active.
>
>
>В общем проверка показывает, что процесс живой и никуда не девался, а
>скрипт рапортует, что уходит в даун. Тоесть, есть подозрения, что виной
>имено модуль Proc::ProcessTable... В чем может быть проблема? Никто не сталкивался
>с подобным?Я если пробовать тоже самое состряпать средствами sh/pgrep/pkill ?! С "нулевым" сигналом?!
Ключевая идея в примере:
chip@nebula:~$ pkill -0 mysqld; echo $?
1
chip@nebula:~$ pkill -0 firefox; echo $?
0
chip@nebula:~$firefox - существующий процесс, mysqld - нет.
>Я если пробовать тоже самое состряпать средствами sh/pgrep/pkill ?! С "нулевым" сигналом?!
>
>
>Ключевая идея в примере:
>chip@nebula:~$ pkill -0 mysqld; echo $?
>1
>chip@nebula:~$ pkill -0 firefox; echo $?
>0
>chip@nebula:~$
>
>firefox - существующий процесс, mysqld - нет.ТОже вариант, просто не хотелось бы пользоваться system и обратными кавычками. Пока решил вариант с обратными кавычками при использовании вызова px -auxwww и парсингом получаемого вывода. Просто мне хотелось бы иметь более менее полную информацию о процессе. И этот мождуль подходил как нельзя лучше, но его глюки... В итоге сейчас переделал под обратные кавычки, как говорил, и вывод ps auxwww более-менее меня устраивает.
Но ваш вариант тоже ничего :) Даже наверное лучше для проверки живучести процесса.