J'ai un script qui doit commencer périodiquement des programmes sur un tableau avec les noms de programme via Perl sous Linux. Le problème est que de temps en temps l'un des programmes prend trop de temps et se bloque et doit être abandonné.L'écriture d'un programme de démarrage qui avorte programmes suspendus
Je suis actuellement le démarrage du programme en utilisant qx/$cmd/
dans un lit séparé fil à partir d'une file d'attente de démarrage partagée. Le thread principal met en file d'attente toutes les x secondes un nouvel élément dans la file d'attente. S'il y a des éléments dans la file d'attente, le thread principal tue le thread enfant et démarre un nouvel enfant.
Cela fonctionne très bien d'un point de vue fonctionnel, mais maintenant je l'ai réalisé que cela conduit à une fuite de mémoire. Comment concevez-vous un tel programme? Y at-il un module CPAN qui peut aider? S'il vous plaît laissez-moi savoir si vous avez besoin de plus de code pour comprendre le problème.
Le fil conducteur ressemble à ceci:
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");
}
Le fil d'enfant comme celui-ci:
sub starterThread{
$SIG{'KILL'}=sub{threads->exit();};
$log->info("Starter Thread started");
while() {
my $programName=$startQueue->dequeue();
$log->debug("programName:$programName");
qx/$programName/;
}
}
ne serait-il pas mieux de savoir pourquoi ces processus sont suspendus et le corriger? – Malfist
Si vous utilisez des ressources externes/bibliothèque, alors c'est hors de votre contrôle/mains ... – weismat
la plupart du temps, oui. Parfois, cela est dû à la façon dont vous l'utilisez. Si ce n'est pas le cas, votre main est obligée de prendre cette approche. – Malfist