User since
2008-09-08
5
Artikel
BenutzerIn
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]
User since
2004-07-19
1776
Artikel
HausmeisterIn
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.
User since
2008-09-08
5
Artikel
BenutzerIn
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
Bemerkung am Rande:
Ich glaube du forkst immer im kindprozess
Allso ungefähr so:
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:
MASTER
+->CHILD
|
+->CHILD
|
+->CHILD
|
+->CHILD
|
+->CHILD
|
+->CHILD
Da werden nur alle gekillt wenn der Elternprozess stirbt wird.
User since
2008-09-08
5
Artikel
BenutzerIn
Gast+2008-09-08 20:39:37--Bemerkung am Rande:
Ich glaube du forkst immer im kindprozess
Allso ungefähr so:
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:
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.
User since
2008-09-08
5
Artikel
BenutzerIn
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.
User since
2006-07-10
2611
Artikel
BenutzerIn
Dann machst du irgendwas falsch.
Gib mal mehr Infos...
Wie sieht das kleinste Script aus, bei dem der Fehler noch auftritt?
Gibt es Fehlermeldungen?
User since
2008-09-08
5
Artikel
BenutzerIn
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.
Kann durchaus sein, daß die win32 module nicht thread-fest sind. Binde sie ein, nachdem du geforkt hast, dann sollte es funktionieren.