Hallo,
weder fork noch exec scheinen mir bei meinem Problem weiter zu helfen, wenn doch, dann habe ich etwas nicht verstanden oder völlig falsch gemacht.
Ich habe einen Server, der über Socket auf eingehende Verbindungen lauscht. Hierfür benutze ich das Perl-Modul IO::Socket::INET. Mein Client sendet "Befehle" oder auch Pfad+Programmname von Prozessen, die nonstop laufen, an den Server. Der Server soll den Befehl oder den Prozess ausführen und danach weiterhin auf den Port lauschen, um gegebenfalls weitere "Befehle" auszuführen. Er soll nicht auf das Ende des Prozesses warten. Das Problem ist nun, dass der Server an der Stelle, an der er den system Befehl ausführt, solange hängt, bis der mit system gestartete Prozess gekillt wird oder sich selbst beendet.
Ich habe schon viele mögliche Varianten ausprobiert und mich über fork im Archiv kundig gemacht, doch keiner meiner Tests war erfolgreich.
while($client = $server->accept()) {
$command=<$client>;
***system Befehl***
}
An der Stelle von ***system Befehl*** habe ich folgende Tests durchgeführt:
system("$command &");
system("$command 1>/dev/null 2>&1 &");
system('$command &');
system('$command 1>/dev/null 2>&1 &');
#------- fork Test -------#
use POSIX;
while($client = $server->accept()) {
$command=<$client>;
$pid = fork;
exit if $pid;
system("$command &");
}
Diese vorgehensweise funktioniert auch nicht, denn der Serverprozess, ob nun Child oder Parent, wartet trotzdem auf das Ende des Prozesses.
Mein Ziel ist, dass der Prozess, der mit $command ausgeführt wird, im Hintergrund abläuft und der Serverprozess weiterhin auf Verbindungen lauschen kann. Dabei möchte ich nicht, dass der Serverprozess dupliziert wird, denn wenn 100 Prozesse gestartet werden sollen, gibt es doch auch den Serverprozess 100 Mal. Das möchte ich vermeiden. Der Prozess in $command soll losgelöst laufen.
Ausserdem ist der Port dann dauernt von xxx anderen Serverprozessen belegt.
Das Problem scheint sichtlich am Serverprozess zu liegen, denn wenn ich eine ganz normale for Schleife in einem Perl-Script verwende, gibt es keine Probleme.
Hier ein simples Beispiel:
#!/usr/bin/perl
for($ct=0 ; $ct <= 10 ; $ct++) {
print "$ct";
system("sar -u 1 100 &");
}
exit;
Die Ausgabe ist wie folgt:
012345678910
Wenn ich dann in die Prozesstabelle schaue, ist der Prozess "sar" dort zu finden. Das Beispiel hing nicht am system Befehl fest. Warum klappt das nicht über den Serverprozess, der den Befehl vom Client erhält?
Gruß,
coolblue
never say oops after you submitted a job :-)