Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7201[/thread]

Multithread Server mit fork: Childs beenden sich nicht (Seite 2)

Leser: 1


<< |< 1 2 3 >| >> 26 Einträge, 3 Seiten
renee
 2005-08-11 15:27
#57116 #57116
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das von Strat hast Du aber schon gelesen?!?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
kevin
 2005-08-11 17:19
#57117 #57117
User since
2005-08-10
24 Artikel
BenutzerIn
[default_avatar]
Also hier nochmal der Server von J-jayz-Z:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/perl
use strict;
use warnings;
use IO::Socket;

my $port = 2345;
my $quit = 0;

$SIG{INT} = sub { $quit++; };

my $socket = IO::Socket::INET->new(
Listen => 20,
LocalPort => $port,
Timeout => 60*60,
Reuse => 1) ||
die "Konnte Socket nicht oeffnen: $!\n";

print "Verbindung auf Port $port wird erwartet...\n";

while(!$quit) {
next unless my $session = $socket->accept();
print $session->peerhost."\n";
my $child = fork();
die "Forking nicht mgoelich: $!\n" unless defined $child;
unless($child) {
$SIG{CHLD} = sub { exit 0; };
$socket->close;
my $peer = gethostbyaddr($session->peeraddr,AF_INET) || $session->peerhost;
print "Verbindung von $peer auf Port $port akzeptiert\n";
print $session "Hallo $peer\n";
while(<$session>) {
print $session "test\n";
}
exit 0;
}
$session->close;
}


Klar hab ich das von Strat gelesen.
Wenn ich mich auf den Server mit telnet server 2345 verbinde, forkt er ganz prima und ich habe (mit pstree -p) einen childprozess.
wenn ich die telnetverbindung abbreche, bekomme ich vom Server zwar die Meldung, dass die Verbindung getrennt ist, aber ps zeigt mir immernoch die PID des child an.!?
J-jayz-Z
 2005-08-11 17:45
#57118 #57118
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
bist du sicher? bei mir ist das nicht so...
Kannst du mal die ausgabe posten, von pstree? Ich kann mir nicht vorstellen, das das ein Zombie Prozess ist, da er ordnungsgemäß mit exit beendet wird?!
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
kevin
 2005-08-11 18:05
#57119 #57119
User since
2005-08-10
24 Artikel
BenutzerIn
[default_avatar]
Nein, kein Zombie, er gehört weiterhin dem Server:

Server:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
   unless($child) {
$SIG{CHLD} = sub { exit 0; };
$socket->close;
my $peer = gethostbyaddr($session->peeraddr,AF_INET) || $session->peerhost;
print "Verbindung von $peer auf Port $port akzeptiert ($$)\n";
print $session "Hallo $peer\n";
while(<$session>) {
print $session "test\n";
}
print "Ende ($$)\n";
exit 0;
}
print "parent ($$)\n";
$session->close;


Serverausgabe während und nach Beenden der Verbindung:
Code: (dl )
1
2
3
4
Verbindung auf Port 2345 wird erwartet...
parent (4063)
Verbindung von karsten.logicway.net auf Port 2345 akzeptiert (4064)
Ende (4064)


pstree während Client - Verbindung:
Code: (dl )
sshd(3522)--sshd(3768)--bash(3770)--anrufserver.pl(4063)-anrufserver.pl(4064)


pstree nach Beenden der Client - Verbindung:
Code: (dl )
sshd(3522)--sshd(3768)--bash(3770)--anrufserver.pl(4063)--anrufserver.pl(4064)


Der Prozess läuft offensichtlich noch!!!

Seltsam

Auf dem Server läuft "Arch Linux 0.7 (Wombat)" und Perl-5.8.6
J-jayz-Z
 2005-08-11 18:20
#57120 #57120
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Das liegt dir glaub ich ein Irrtum vor.
Das ist doch nur der Prozess von dem Server?!
Es muss noch einen weiteren Prozess geben, wenn eine Clientverbindung besteht. Der Server ist ja noch aktiv. Nur die Clientverbindung ist geschlossen.
Oder interpretier ich diesen Eintrag falsch? ? ?
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
Strat
 2005-08-11 18:28
#57121 #57121
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
gibt es vielleicht unklarheiten thread <-> prozess? denn fork erzeugt einen neuen prozess, keinen neuen thread...
Code: (dl )
$title =~ s/Multithread/Multiprozess/


vielleicht mal mit ps aux nachschauen, wie viele prozesse dafuer laufen?\n\n

<!--EDIT|Strat|1123770588-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
kevin
 2005-08-11 18:34
#57122 #57122
User since
2005-08-10
24 Artikel
BenutzerIn
[default_avatar]
Also nochmal die Prozessliste:

Ergebnisse mit ps -A | grep anrufserver.

Server mit 3 Clientverbindungen:
Code: (dl )
1
2
3
4
 4093 pts/0    00:00:00 anrufserver.pl
4094 pts/0 00:00:00 anrufserver.pl
4095 pts/0 00:00:00 anrufserver.pl
4106 pts/0 00:00:00 anrufserver.pl


Server mit nur noch einer Clientverbindung (also zwei der obigen beendet):
Code: (dl )
1
2
3
4
 4093 pts/0    00:00:00 anrufserver.pl
4094 pts/0 00:00:00 anrufserver.pl <defunct>
4095 pts/0 00:00:00 anrufserver.pl
4106 pts/0 00:00:00 anrufserver.pl <defunct>
Strat
 2005-08-11 19:09
#57123 #57123
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
versuche mal nach dem close ein
shutdown($client, 2);
(oder 1 => ende schreiben, 0 => ende lesen, 2 => ende der benutzung; 2 ist halt recht hart, vielleicht reicht 1 oder 0, je nachdem, ob du gelesen oder geschrieben hast)

weiters ist dein signalhandler suboptimal (den auskommentierten meine ich; der aktive taugt nichts):
Code: (dl )
1
2
3
4
5
6
7
use POSIX qw(:sys_wait_h);

sub REAPER {
1 until (-1 == waitpid(-1, WNOHANG));
$SIG{CHLD} = \&REAPER;
}
$SIG{CHLD} = \&REAPER;
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
kevin
 2005-08-12 10:20
#57124 #57124
User since
2005-08-10
24 Artikel
BenutzerIn
[default_avatar]
@Strat:

Ich habe deine Vorschläge ausprobiert, aber es hat sich leider an der Prozessliste nichts geändert.
renee
 2005-08-12 10:28
#57125 #57125
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
merk Dir die PID des geforketen Prozessen in einem Hash und mach dann ein kill 9,$pid...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 3 >| >> 26 Einträge, 3 Seiten



View all threads created 2005-08-10 17:17.