리눅스에서 Perl을 통해 프로그램 이름 배열로 프로그램을 주기적으로 시작해야하는 스크립트가 있습니다. 문제는 때때로 프로그램 중 하나가 너무 오래 걸리고 중단되고 중단되어야한다는 것입니다.교수형 프로그램을 중단하는 스타터 프로그램 작성하기
현재 공유 시작 대기열에서 읽는 별도의 스레드에서 qx/$cmd/
을 사용하여 프로그램을 시작합니다. 주 스레드는 새 요소를 큐에 x 초마다 큐에 넣습니다. 큐에 요소가있는 경우 주 스레드가 자식 스레드를 종료하고 새 자식을 시작합니다.
이것은 기능적인 관점에서 잘 작동하지만 지금은 메모리 누수가 발생한다는 것을 깨달았습니다. 그런 프로그램을 어떻게 설계 하시겠습니까? CPAN 모듈이 도움이 될 수 있습니까? 문제를 이해하기 위해 추가 코드가 필요한 경우 알려주십시오.
주요 스레드는 다음과 같습니다
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");
}
이 같은 자식 스레드 :
sub starterThread{
$SIG{'KILL'}=sub{threads->exit();};
$log->info("Starter Thread started");
while() {
my $programName=$startQueue->dequeue();
$log->debug("programName:$programName");
qx/$programName/;
}
}
왜 이러한 프로세스가 걸려 있는지 확인하는 것이 더 낫지 않습니까? – Malfist
외부 ressources/library를 사용하면 제어/손에서 벗어납니다. – weismat
대부분의 경우 예. 때로는 그것을 사용하는 방식으로 인해 발생합니다. 손이 아닌 경우이 방법을 택해야합니다. – Malfist