Thread Zombies nach Neustart (7 answers)
Opened by gastinowitsch at 2024-03-26 03:00

Gast gastinowitsch
 2024-03-26 13:56
#195983 #195983
Quote
Du sammelst die Prozesse mit push @{$self->{chld_processes}}. Das läßt vermuten, dass $self ein "übliches" Perl-Objekt ist - und Du direkt in den Hash reingreifst. Bei den Aufrufen von kill und waitpid verwendest Du dagegen die Methode $self->chld_processes.


Das sah nur so aus, weil ich das push @{$self->{chld_processes}} aus dem Getter/Setter kopiert habe um zur Vereinfachung diesen nicht komplett mit kopieren zu müssen, da das push via Setter erst weit entfernt im Code passiert.

Der Tipp von dir und rosti bzgl. des return values von waitpid hat das Problem augenscheinlich gelöst, ich mache es jetzt so und die Zombies werden nach wenigen Sekunden gereaped:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sub restart {
my $self = shift;
my $good_data = shift;

sleep 1;

use POSIX ":sys_wait_h";
kill('SIGTERM', @{$self->chld_processes});
1 while waitpid(-1, WNOHANG) > 0;

# for my $pid (@{$self->chld_processes}) {
# say "WAIT $pid"; #CORRECT PID
# say waitpid($pid, 0); #ALWAYS -1
# }

exec($^X, $0, $ARGV[0], $good_data);
exit 0;
}


Da ich nicht 100% genau weiß was ich da mache - Ist das im Prinzip so sauber/korrekt/kann man das so machen?
Der Code wird natürlich noch aufgeräumt...

Beste Grüße und vielen Dank
Last edited: 2024-03-26 17:35:18 +0100 (CET)

View full thread Zombies nach Neustart