2012-05-23 3 views
0

배열 작업을 SGE에 제출하는 Perl 스크립트가 있습니다. 모든 작업을 병렬로 실행하여 시간을 절약하고 스크립트가 모든 작업을 마칠 때까지 기다렸다가 모든 SGE 출력 파일의 정보를 통합하고 최종 출력을 생성하는 다음 처리 단계로 넘어갑니다. 내가 사용, 대기 다음 배경으로 모든 작업을 보내고하기 위해-sync yes 옵션을 사용하여 SGE에 작업 종료 코드 인쇄 방지

병렬 :: ForkManager 및 루프 :

일에 "대기"일부 위해서는
$fork_manager = new Parallel::ForkManager(@as); 
# @as: Max nb of processes to run simultaneously 
for $a (@as) { 
    $fork_manager->start and next; # Starts the child process 
    system "qsub <qsub_options> ./script.plx"; 
    $fork_manager->finish; # Terminates the child process 
} 
$fork_manager->wait_all_children; 
<next processing step, local> 

그러나, 내가 가진 qsub 옵션에 "-sync yes"를 추가해야했습니다. 그러나 SGE는이 작업의 "부작용"으로 각 배열 작업의 각 작업에 대한 종료 코드를 인쇄하며 많은 작업이 있고 단일 작업이 가볍기 때문에 기본적으로 모든 쉘 메시지를 사용하기 때문에 내 셸을 사용할 수 없게 만듭니다. qsub 작업이 실행 중입니다.

어떻게 이러한 메시지를 제거 할 수 있습니까? 내가 qsub의 작업 종료 코드를 확인하는 데 관심이 있습니다. (모든 작업이 다음 단계 전에 확인되었음을 확인할 수 있습니다.)하지만 각 작업의 종료 코드가 아닙니다 (어쨌든 옵션을 통해 작업의 오류를 기록합니다.) 나는 그것을 필요로 할 때).

답변

0

가장 간단한 해결책은 즉

system("qsub <qsub options> ./script.plx >/dev/null 2>&1"); 

곳은 qsub의 출력,하지만 당신이보고 할 수 있습니다이 마스크 오류를 리디렉션하는 것입니다. 또는 open()을 사용하여 하위 프로세스를 시작하고 출력을 읽을 수 있습니다. 하위 프로세스에서 오류가 발생하는 경우에만 인쇄합니다.

그래도 대체 솔루션이 있습니다. -sync y없이 SGE에 작업을 제출하고 qsub이 인쇄 할 때 작업 ID를 캡처 할 수 있습니다. 그런 다음 요약 및 결과 콜렉션 코드를 후속 작업으로 전환하고 첫 번째 작업 완료에 대한 종속성으로 제출하십시오. -sync y를 사용하여이 최종 작업을 제출하면 호출 스크립트가 종료 할 때까지 기다릴 수 있습니다. qsub man 페이지의 -hold_jid에 대한 설명서를 참조하십시오.

또한 호출 스크립트가 다음 작업을 제출할 시간을 결정할 때 (최대까지) SGE의 -tc 옵션을 사용하여 동시 작업의 최대 수를 지정하십시오 (-tc는 man에 없음을 유의하십시오 페이지에 있지만 qsub의 -help 출력에 있음). 이것은 물론 SGE를 충분히 사용하여 -tc를 사용하는 것에 달려 있습니다.