2009-06-01 3 views
2

리눅스에서 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/; 
    } 
} 
+0

왜 이러한 프로세스가 걸려 있는지 확인하는 것이 더 낫지 않습니까? – Malfist

+0

외부 ressources/library를 사용하면 제어/손에서 벗어납니다. – weismat

+0

대부분의 경우 예. 때로는 그것을 사용하는 방식으로 인해 발생합니다. 손이 아닌 경우이 방법을 택해야합니다. – Malfist

답변

2

주어진 시간에 고정 된 수의 하위 프로세스를 관리 할 수있는 Parallel::ForkManager을 살펴볼 수 있습니다. 프로그램 이름 배열은 스크립트의 수명을 통해 정적으로 유지되거나 지속적으로 자체를 업데이트합니까?

메모리 누수가 생기다. 스크립트를 프로파일 링하여 kill/enqueue가 메모리 누수로 연결된다는 것을 절대적으로 판단 했습니까?

+0

Log4Perl을 사용하고 있으며 모든 스레드가 ps를 통해 프로세스 크기가 증가하고 free -m을 통해 시스템의 여유 메모리가 감소하는 것을 볼 수 있습니다. – weismat

+0

토론의 시작 부분에 관련 코드 부분을 추가했습니다. – weismat

+0

다중 스레드 응용 프로그램에서 Parallel :: ForkManager를 사용할 수 있습니까?이 프로그램은 어쨌든 두 개의 스레드가 될 것입니다 .... – weismat

0

그런 관리자 프로세스에 대한 대안은 타임 스탬프와 PID 파일 (즉, 내용은 pidtimestamp), sendmail과 같습니다. 그런 다음 cron 등에서 매분마다 프로세스의 새 복사본을 시작하고 이전 프로세스가 있으면 새 프로세스가 종료되거나 (타임 스탬프가 최근 인 경우) 이전 프로세스가 종료됩니다 (타임 스탬프가 오래된 경우) .

관리자 프로세스가 필연적으로 메모리 누수를 유발해야하는 이유는 실제로 알지 못합니다. 이것이 사실이라는 것을 확고히 밝혔습니까? 너의 추론은 뭐니?

+0

나는 스레드 죽이기가 제대로 작동하지 않는다고 생각한다 - 죽이는 쓰레드는 어떤 경우에도 더러운 연산이지만, 펄은 결코 메모리를 해제하지 않는 것처럼 보인다. 나는 버그 보고서에 대한 문제를 최소화하려고 노력할 것이다. – weismat

0

일반적으로 체이서 프로그램보다는 프로그램 자체에서 ALARM 신호 + 자체 슬레이밍을 사용하십시오.

관련 문제