mirror of
https://github.com/centreon/centreon-plugins.git
synced 2025-07-28 08:04:36 +02:00
Fix 100% Cpu main process when a child is killed
This commit is contained in:
parent
5bf71612d6
commit
c9982490d5
@ -6,7 +6,7 @@ use IO::Socket;
|
|||||||
use Getopt::Long;
|
use Getopt::Long;
|
||||||
|
|
||||||
my $PROGNAME = $0;
|
my $PROGNAME = $0;
|
||||||
my $VERSION = "1.5.3";
|
my $VERSION = "1.5.5";
|
||||||
my %ERRORS = (OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3, DEPENDENT => 4);
|
my %ERRORS = (OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3, DEPENDENT => 4);
|
||||||
my $socket;
|
my $socket;
|
||||||
my $separatorin = '~';
|
my $separatorin = '~';
|
||||||
|
@ -20,7 +20,7 @@ BEGIN {
|
|||||||
use base qw(centreon::script);
|
use base qw(centreon::script);
|
||||||
use vars qw(%centreonesxd_config);
|
use vars qw(%centreonesxd_config);
|
||||||
|
|
||||||
my $VERSION = "1.5.3";
|
my $VERSION = "1.5.5";
|
||||||
my %handlers = (TERM => {}, HUP => {}, CHLD => {});
|
my %handlers = (TERM => {}, HUP => {}, CHLD => {});
|
||||||
my @load_modules = ('centreon::esxd::cmdcountvmhost',
|
my @load_modules = ('centreon::esxd::cmdcountvmhost',
|
||||||
'centreon::esxd::cmdcpuhost',
|
'centreon::esxd::cmdcpuhost',
|
||||||
@ -240,6 +240,29 @@ sub load_module {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub verify_child_vsphere {
|
||||||
|
my $self = shift;
|
||||||
|
|
||||||
|
# Don't need that. We need to quit. Don't want to recreate sub-process :)
|
||||||
|
return if ($self->{stop} != 0);
|
||||||
|
|
||||||
|
# Some dead process. need to relaunch it
|
||||||
|
foreach (keys %{$self->{return_child}}) {
|
||||||
|
delete $self->{return_child}->{$_};
|
||||||
|
if (defined($self->{centreonesxd_config}->{vsphere_server}->{$_})) {
|
||||||
|
$self->{logger}->writeLogError("Sub-process for '" . $self->{centreonesxd_config}->{vsphere_server}->{$_}->{name} . "' dead ???!! We relaunch it");
|
||||||
|
|
||||||
|
close $self->{centreonesxd_config}->{vsphere_server}->{ $self->{centreonesxd_config}->{vsphere_server}->{$_}->{name} }->{writer_two};
|
||||||
|
close $self->{centreonesxd_config}->{vsphere_server}->{ $self->{centreonesxd_config}->{vsphere_server}->{$_}->{name} }->{reader_one};
|
||||||
|
delete $self->{filenos}->{ $self->{centreonesxd_config}->{vsphere_server}->{$_}->{fd} };
|
||||||
|
$self->{read_select}->remove($self->{centreonesxd_config}->{vsphere_server}->{$_}->{fd});
|
||||||
|
|
||||||
|
$self->create_vsphere_child(vsphere_name => $self->{centreonesxd_config}->{vsphere_server}->{$_}->{name});
|
||||||
|
delete $self->{centreonesxd_config}->{vsphere_server}->{$_};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sub verify_child {
|
sub verify_child {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $progress = 0;
|
my $progress = 0;
|
||||||
@ -423,6 +446,39 @@ sub vsphere_handler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub create_vsphere_child {
|
||||||
|
my ($self, %options) = @_;
|
||||||
|
|
||||||
|
$self->{logger}->writeLogInfo("Create vsphere sub-process for '" . $options{vsphere_name} . "'");
|
||||||
|
my ($reader_pipe_one, $writer_pipe_one);
|
||||||
|
my ($reader_pipe_two, $writer_pipe_two);
|
||||||
|
$self->{whoaim} = $options{vsphere_name};
|
||||||
|
|
||||||
|
pipe($reader_pipe_one, $writer_pipe_one);
|
||||||
|
pipe($reader_pipe_two, $writer_pipe_two);
|
||||||
|
$writer_pipe_one->autoflush(1);
|
||||||
|
$writer_pipe_two->autoflush(1);
|
||||||
|
|
||||||
|
$self->{centreonesxd_config}->{vsphere_server}->{$self->{whoaim}}->{reader_one} = \*$reader_pipe_one;
|
||||||
|
$self->{centreonesxd_config}->{vsphere_server}->{$self->{whoaim}}->{writer_one} = \*$writer_pipe_one;
|
||||||
|
$self->{centreonesxd_config}->{vsphere_server}->{$self->{whoaim}}->{reader_two} = \*$reader_pipe_two;
|
||||||
|
$self->{centreonesxd_config}->{vsphere_server}->{$self->{whoaim}}->{writer_two} = \*$writer_pipe_two;
|
||||||
|
$self->{child_vpshere_pid} = fork();
|
||||||
|
if (!$self->{child_vpshere_pid}) {
|
||||||
|
close $self->{centreonesxd_config}->{vsphere_server}->{$self->{whoaim}}->{reader_one};
|
||||||
|
close $self->{centreonesxd_config}->{vsphere_server}->{$self->{whoaim}}->{writer_two};
|
||||||
|
$self->vsphere_handler();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
$self->{centreonesxd_config}->{vsphere_server}->{$self->{whoaim}}->{running} = 1;
|
||||||
|
$self->{centreonesxd_config}->{vsphere_server}->{$self->{child_vpshere_pid}} = { name => $self->{whoaim}, fd => fileno(${$self->{centreonesxd_config}->{vsphere_server}->{$options{vsphere_name}}->{reader_one}})};
|
||||||
|
close $self->{centreonesxd_config}->{vsphere_server}->{$self->{whoaim}}->{writer_one};
|
||||||
|
close $self->{centreonesxd_config}->{vsphere_server}->{$self->{whoaim}}->{reader_two};
|
||||||
|
|
||||||
|
$self->{filenos}->{fileno(${$self->{centreonesxd_config}->{vsphere_server}->{$options{vsphere_name}}->{reader_one}})} = 1;
|
||||||
|
$self->{read_select}->add(${$self->{centreonesxd_config}->{vsphere_server}->{$options{vsphere_name}}->{reader_one}});
|
||||||
|
}
|
||||||
|
|
||||||
sub run {
|
sub run {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
@ -444,38 +500,13 @@ sub run {
|
|||||||
##
|
##
|
||||||
# Create childs
|
# Create childs
|
||||||
##
|
##
|
||||||
foreach (keys %{$self->{centreonesxd_config}->{vsphere_server}}) {
|
|
||||||
my ($reader_pipe_one, $writer_pipe_one);
|
|
||||||
my ($reader_pipe_two, $writer_pipe_two);
|
|
||||||
$self->{whoaim} = $_;
|
|
||||||
|
|
||||||
pipe($reader_pipe_one, $writer_pipe_one);
|
|
||||||
pipe($reader_pipe_two, $writer_pipe_two);
|
|
||||||
$writer_pipe_one->autoflush(1);
|
|
||||||
$writer_pipe_two->autoflush(1);
|
|
||||||
|
|
||||||
$self->{centreonesxd_config}->{vsphere_server}->{$self->{whoaim}}->{reader_one} = \*$reader_pipe_one;
|
|
||||||
$self->{centreonesxd_config}->{vsphere_server}->{$self->{whoaim}}->{writer_one} = \*$writer_pipe_one;
|
|
||||||
$self->{centreonesxd_config}->{vsphere_server}->{$self->{whoaim}}->{reader_two} = \*$reader_pipe_two;
|
|
||||||
$self->{centreonesxd_config}->{vsphere_server}->{$self->{whoaim}}->{writer_two} = \*$writer_pipe_two;
|
|
||||||
$self->{child_vpshere_pid} = fork();
|
|
||||||
if (!$self->{child_vpshere_pid}) {
|
|
||||||
close $self->{centreonesxd_config}->{vsphere_server}->{$self->{whoaim}}->{reader_one};
|
|
||||||
close $self->{centreonesxd_config}->{vsphere_server}->{$self->{whoaim}}->{writer_two};
|
|
||||||
$self->vsphere_handler();
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
$self->{centreonesxd_config}->{vsphere_server}->{$self->{whoaim}}->{running} = 1;
|
|
||||||
close $self->{centreonesxd_config}->{vsphere_server}->{$self->{whoaim}}->{writer_one};
|
|
||||||
close $self->{centreonesxd_config}->{vsphere_server}->{$self->{whoaim}}->{reader_two};
|
|
||||||
}
|
|
||||||
|
|
||||||
$self->{read_select} = new IO::Select();
|
$self->{read_select} = new IO::Select();
|
||||||
$self->{read_select}->add($server);
|
$self->{read_select}->add($server);
|
||||||
|
|
||||||
foreach (keys %{$self->{centreonesxd_config}->{vsphere_server}}) {
|
foreach (keys %{$self->{centreonesxd_config}->{vsphere_server}}) {
|
||||||
$self->{filenos}->{fileno(${$self->{centreonesxd_config}->{vsphere_server}->{$_}->{reader_one}})} = 1;
|
$self->create_vsphere_child(vsphere_name => $_);
|
||||||
$self->{read_select}->add(${$self->{centreonesxd_config}->{vsphere_server}->{$_}->{reader_one}});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
my $socket_fileno = fileno($server);
|
my $socket_fileno = fileno($server);
|
||||||
$self->{logger}->writeLogInfo("[Server accepting clients]");
|
$self->{logger}->writeLogInfo("[Server accepting clients]");
|
||||||
while (1) {
|
while (1) {
|
||||||
@ -568,6 +599,9 @@ sub run {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Check if there some dead sub-process.
|
||||||
|
$self->verify_child_vsphere();
|
||||||
|
|
||||||
# Verify socket
|
# Verify socket
|
||||||
foreach (keys %{$self->{sockets}}) {
|
foreach (keys %{$self->{sockets}}) {
|
||||||
if (time() - $self->{sockets}->{$_}->{ctime} > $self->{centreonesxd_config}->{timeout}) {
|
if (time() - $self->{sockets}->{$_}->{ctime} > $self->{centreonesxd_config}->{timeout}) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user