mirror of
https://github.com/pragma-/pbot.git
synced 2024-11-29 23:39:24 +01:00
ProcessManager: properly remove completed processes
This commit is contained in:
parent
ecd1e4dc86
commit
8232106f54
@ -16,15 +16,15 @@ use feature 'unicode_strings';
|
|||||||
use POSIX qw(WNOHANG);
|
use POSIX qw(WNOHANG);
|
||||||
use JSON;
|
use JSON;
|
||||||
|
|
||||||
# automatically reap children processes in background
|
|
||||||
$SIG{CHLD} = sub { while (waitpid(-1, WNOHANG) > 0) {} };
|
|
||||||
|
|
||||||
sub initialize {
|
sub initialize {
|
||||||
my ($self, %conf) = @_;
|
my ($self, %conf) = @_;
|
||||||
$self->{pbot}->{commands}->register(sub { $self->ps_cmd(@_) }, 'ps', 0);
|
$self->{pbot}->{commands}->register(sub { $self->ps_cmd(@_) }, 'ps', 0);
|
||||||
$self->{pbot}->{commands}->register(sub { $self->kill_cmd(@_) }, 'kill', 1);
|
$self->{pbot}->{commands}->register(sub { $self->kill_cmd(@_) }, 'kill', 1);
|
||||||
$self->{pbot}->{capabilities}->add('admin', 'can-kill');
|
$self->{pbot}->{capabilities}->add('admin', 'can-kill');
|
||||||
$self->{processes} = {};
|
$self->{processes} = {};
|
||||||
|
|
||||||
|
# automatically reap children processes in background
|
||||||
|
$SIG{CHLD} = sub { my $pid; do { $pid = waitpid(-1, WNOHANG); $self->remove_process($pid) if $pid > 0; } while $pid > 0; };
|
||||||
}
|
}
|
||||||
|
|
||||||
sub ps_cmd {
|
sub ps_cmd {
|
||||||
@ -93,6 +93,9 @@ sub execute_process {
|
|||||||
*PBot::IRC::Connection::DESTROY = sub { return; };
|
*PBot::IRC::Connection::DESTROY = sub { return; };
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
|
# remove atexit handlers
|
||||||
|
$self->{pbot}->{atexit}->unregister_all;
|
||||||
|
|
||||||
# execute the provided subroutine, results are stored in $stuff
|
# execute the provided subroutine, results are stored in $stuff
|
||||||
eval {
|
eval {
|
||||||
local $SIG{ALRM} = sub { die "PBot::Process `$stuff->{commands}->[0]` timed-out" };
|
local $SIG{ALRM} = sub { die "PBot::Process `$stuff->{commands}->[0]` timed-out" };
|
||||||
@ -105,8 +108,8 @@ sub execute_process {
|
|||||||
# check for errors
|
# check for errors
|
||||||
if ($@) {
|
if ($@) {
|
||||||
$stuff->{result} = $@;
|
$stuff->{result} = $@;
|
||||||
$stuff->{result} =~ s/ at PBot.*$//ms;
|
|
||||||
$self->{pbot}->{logger}->log("Error executing process: $stuff->{result}\n");
|
$self->{pbot}->{logger}->log("Error executing process: $stuff->{result}\n");
|
||||||
|
$stuff->{result} =~ s/ at PBot.*$//ms;
|
||||||
}
|
}
|
||||||
|
|
||||||
# print $stuff to pipe
|
# print $stuff to pipe
|
||||||
@ -127,7 +130,6 @@ sub execute_process {
|
|||||||
|
|
||||||
sub process_pipe_reader {
|
sub process_pipe_reader {
|
||||||
my ($self, $pid, $buf) = @_;
|
my ($self, $pid, $buf) = @_;
|
||||||
$self->remove_process($pid);
|
|
||||||
my $stuff = decode_json $buf or do {
|
my $stuff = decode_json $buf or do {
|
||||||
$self->{pbot}->{logger}->log("Failed to decode bad json: [$buf]\n");
|
$self->{pbot}->{logger}->log("Failed to decode bad json: [$buf]\n");
|
||||||
return;
|
return;
|
||||||
|
Loading…
Reference in New Issue
Block a user