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

exit bei Fork funktioniert unter Windows 2003 nicht richtig

Leser: 2


<< >> 10 Einträge, 1 Seite
Perluser
 2008-09-08 21:26
#114379 #114379
User since
2008-09-08
5 Artikel
BenutzerIn
[default_avatar]
Hallo Leute,

ich bin schon langsam am verzweifeln. Aufgabe ist es den Kindprozeß x-mal parrallel auszuführen. Ich habe in einen Perl Script deshalb ein Fork eingebaut, das auch funktioniert.

Das Funktioniert auch problemlos bis auf den Exit befehl. In sämtlichen Internetseiten die ich gelesen habe, steht, das Perl nur den jeweiligen Kind Prozeß beendet und nicht das komplette Programm oder andere Kind-Prozesse.

Bei mir ist es so, das ich die alle (im Test sind 15 Kindprozesse aktiv) Ihre Arbeit erledigen, bis zu dem Zeitpunkt an dem einer dieser Kindprozesse sich beendet.

Im Log sieht das so aus:

08.09.2008 19:08:26 -4932 smsdvsparda_20080908190744 Datensenden(): Robocopy Verzeichnisse erfolgreich aktualisiert
08.09.2008 19:08:26 -4932 FTAuftragssteuerung(): Kindeprozess 0 zu ende

Schon der Logeintrag "...nach dem Exit...." erscheint nicht mehr, weshalb ich davon ausgehe, das hier das gesamte Perl-programm beendet wird.

Hier der Code dazu:

my $Eltern_PID = $$;
my $Kind_PID = fork();
if ($Kind_PID == 0)
{
Funktion_KindProzess
}
print "\nKindeprozess $Kind_PID zu ende\n";
#die;
&logit($loglevel, 2, "FTAuftragssteuerung(): Kindeprozess $Kind_PID zu ende" , $me);
exit(0);
&logit($loglevel, 2, "FTAuftragssteuerung(): Kindeprozess nach dem Exit" , $me);
print "\n Kindprozess nach exit";
}
else
{
Funkition_elternprozeß()
}


Auch bei der Struktur
if ($Kind_PID)
{
Vaterprozeß befehle
}
else
{
Kind prozeß befehle
}

führt zum gleichen ergebnis.

Was mache ich falsch oder welche Infos braucht Ihr noch.

[code]
murphy
 2008-09-08 21:38
#114381 #114381
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Perluser+2008-09-08 19:26:42--
[...]
Was mache ich falsch oder welche Infos braucht Ihr noch.
[...]


Du verwendest das falsche Betriebssystem ;-)

Windows kennt auf Systemebene kein Forken von Prozessen. Daher wird, wenn ich mich nicht irre, von Perl die Funktion fork unter Windows über Interpreterthreads emuliert.
When C++ is your hammer, every problem looks like your thumb.
Perluser
 2008-09-08 22:04
#114383 #114383
User since
2008-09-08
5 Artikel
BenutzerIn
[default_avatar]
murphy+2008-09-08 19:38:35--
Perluser+2008-09-08 19:26:42--
[...]
Was mache ich falsch oder welche Infos braucht Ihr noch.
[...]


Du verwendest das falsche Betriebssystem ;-)

Windows kennt auf Systemebene kein Forken von Prozessen. Daher wird, wenn ich mich nicht irre, von Perl die Funktion fork unter Windows über Interpreterthreads emuliert.


Das ist richtig. Diese Aussage habe ich auch bei den div. Beschreibungen gefunden. Nur dort steht auch das Perl die Fork Funktion emuliert und damit ein Fork unter Windows möglich sein soll.

Auszug:
exit()

exit() always exits just the executing pseudo-process, after automatically wait()-ing for any outstanding child pseudo-processes. Note that this means that the process as a whole will not exit unless all running pseudo-processes have exited.

Quelle: http://www.xav.com/perl/lib/Pod/perlfork.html
Gast Gast
 2008-09-08 22:31
#114384 #114384
Versuch mal das:
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
#!/usr/bin/perl
use strict;
use warnings;
use POSIX;

my $forks=10;
while($forks){
my $pid=fork() or die "no fork!\n";
unless($pid){
# im kindprozess
print "CHILD: $$ running\n";
sleep(10);
print "CHILD: $$ exit\n";
exit;
}else{
# im mutterprozess
$forks--;
print "MASTER: add $pid\n";
sleep(1);
}
}

# Auf die Kinder warten
my $still_running=1;
while($still_running){
$still_running=waitpid(-1, WNOHANG);
}
Gast Gast
 2008-09-08 22:39
#114385 #114385
Bemerkung am Rande:
Ich glaube du forkst immer im kindprozess
Allso ungefähr so:
Code: (dl )
1
2
3
4
5
6
MASTER
+->CHILD
+->CHILD
+->CHILD
+->CHILD
+->CHILD

Wenn du da das erste Kind abschießt sterben auch alle anderen.

Der Code oben forkt immer im Elternprozess:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
MASTER
+->CHILD
|
+->CHILD
|
+->CHILD
|
+->CHILD
|
+->CHILD
|
+->CHILD

Da werden nur alle gekillt wenn der Elternprozess stirbt wird.
Perluser
 2008-09-08 22:57
#114386 #114386
User since
2008-09-08
5 Artikel
BenutzerIn
[default_avatar]
Gast+2008-09-08 20:39:37--
Bemerkung am Rande:
Ich glaube du forkst immer im kindprozess
Allso ungefähr so:
Code: (dl )
1
2
3
4
5
6
MASTER
+->CHILD
+->CHILD
+->CHILD
+->CHILD
+->CHILD

Wenn du da das erste Kind abschießt sterben auch alle anderen.

Der Code oben forkt immer im Elternprozess:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
MASTER
+->CHILD
|
+->CHILD
|
+->CHILD
|
+->CHILD
|
+->CHILD
|
+->CHILD

Da werden nur alle gekillt wenn der Elternprozess stirbt wird.


Um den Code-Schnipsel von mir ist noch eine Schleife, so das die o.g. Code immer wieder aufgerufen wird.

Ich werde das ganze mal nach euren Beispiel oben umbauen und wieder Bescheid geben.

Danke für den Tip.
Perluser
 2008-09-09 18:25
#114426 #114426
User since
2008-09-08
5 Artikel
BenutzerIn
[default_avatar]
Hallo Leute,

ich habe mir mal die Prozeß-ID ausgeben lassen und festgestellt, das die Sohn Prozesse alle vom Vater Prozeß ausgehen.

eure Scripte / Code funktionieren wenn ich diese in ein einfaches Testscript einbaue. Sobald ich aber den Code in mein Script einbaue, tritt der Fehler erneut auf und exit beendet das komplette Programm incl. sämtlicher Unterprogramme.
topeg
 2008-09-09 19:12
#114430 #114430
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Dann machst du irgendwas falsch.
Gib mal mehr Infos...

Wie sieht das kleinste Script aus, bei dem der Fehler noch auftritt?
Gibt es Fehlermeldungen?
Perluser
 2008-09-09 19:22
#114432 #114432
User since
2008-09-08
5 Artikel
BenutzerIn
[default_avatar]
Hi,

ich glaube ich habe die Ursache gerade entdeckt.

Ich habe "use Win32::OLE qw(in);" verwendet. Sobald ich dieses Modul auskommentiere, funktioniert das ganze.

Vielen Dank für eure Hilfe.
Gast Gast
 2008-09-09 19:46
#114435 #114435
Kann durchaus sein, daß die win32 module nicht thread-fest sind. Binde sie ein, nachdem du geforkt hast, dann sollte es funktionieren.
<< >> 10 Einträge, 1 Seite



View all threads created 2008-09-08 21:26.