Ich habe ein Skript, das regelmäßig Programme aus einem Array mit Programmnamen über Perl unter Linux starten muss. Das Problem ist, dass von Zeit zu Zeit eines der Programme zu lange dauert/hängt und abgebrochen werden muss.Schreiben eines Startprogramms, das hängende Programme abbricht
Derzeit starte ich das Programm mit qx/$cmd/
in einem separaten Thread, der aus einer freigegebenen Startwarteschlange liest. Der Haupt-Thread reiht alle x Sekunden ein neues Element in die Warteschlange ein. Wenn sich Elemente in der Warteschlange befinden, wird der untergeordnete Thread vom Hauptthread beendet und ein neues untergeordnetes Objekt wird gestartet.
Dies funktioniert aus funktionaler Sicht gut, aber jetzt habe ich erkannt, dass dies zu einem Speicherverlust führt. Wie würdest du ein solches Programm gestalten? Gibt es ein CPAN-Modul, das helfen kann? Bitte lassen Sie mich wissen, wenn Sie weiteren Code benötigen, um das Problem zu verstehen.
Der Haupt-Thread sieht wie folgt aus:
if (!$startQueue->pending) {
$startQueue->enqueue($programList[$i++]);
} else {
$log->warn("Aborting hanging execution");
$starterThread->kill('KILL')->detach();
$log->info("Creating new thread");
$starterThread=threads->create("starterThread");
}
Das Kind Thread wie folgt aus:
sub starterThread{
$SIG{'KILL'}=sub{threads->exit();};
$log->info("Starter Thread started");
while() {
my $programName=$startQueue->dequeue();
$log->debug("programName:$programName");
qx/$programName/;
}
}
Wäre es nicht besser, herauszufinden, warum diese Prozesse hängen und korrigieren? – Malfist
Wenn Sie externe Ressourcen/Bibliothek verwenden, ist es außerhalb Ihrer Kontrolle/Hände ... – weismat
die meiste Zeit, ja. Manchmal liegt es an der Art, wie Sie es benutzen. Wenn das nicht der Fall ist, ist Ihre Hand gezwungen, diesen Ansatz zu wählen. – Malfist