2010-06-02 8 views
0

프로그램을 N 번 병렬로 실행하는 간단한 테스트 셸 스크립트를 원하고 각각 다른 출력을 다른 파일에 저장합니다. 나는 프로그램을 병렬로 시작하고 출력을 저장하는 시작을 만들었지 만 어떻게 다른 출력 만 유지할 수 있습니까? 또한 실제로 어떻게하면 echo DONE!을 끝까지 표시 할 수 있습니까? 당신의 출력을하기 위해테스트 용 쉘 스크립트

#!/bin/bash 

N=10 

for((i=1; j<=$N; ++i)); do 
    ./test > output-$N & 
done 
echo DONE! 
+0

지금 삭제 된 답변에서 지적한 것처럼 'j'는 'i'여야합니다. 또한'output- $ N'은 각각의 테스트에서 같은 파일 "output-10"을 덮어 쓸 것입니다. 나는 여러분이'output- $ i'을 원한다고 확신합니다. 그래서 여러분은 10 개의 다른 출력 파일을 가지고 있습니다. –

답변

3

당신은 대기 내장을 사용하는 것이 좋습니다.

대기 [N ...]

지정된 각 프로세스 기다린은 종료 상태를 반환한다. 각 n은 프로세스 ID 또는 작업 스펙 일 수 있습니다. 작업 사양이 주어지면 해당 작업의 파이프 라인에있는 모든 프로세스가 대기합니다. n을 지정하지 않으면 현재 활성화 된 모든 자식 프로세스가 대기하고 반환 상태는 0입니다. n이 존재하지 않는 프로세스 또는 작업을 지정하면 리턴 상태는 127입니다. 그렇지 않으면 리턴 상태는 마지막 프로세스 또는 대기중인 작업의 종료 상태입니다.

wait %1 %2 %3 ... 

을하지만만큼 당신이 다른 자식 프로세스가 없기 때문에, 당신은 단지 인수로 사용할 수 있습니다;

당신은 %1, %2으로, ... 당신의 작업을 지정할 수 있습니다 모든 자식 프로세스를 완료하는 것이 기다립니다 것이다 : 단지 서로 다른 출력을 유지하는 방법

for ...; do 
    ... 
done 
wait 
echo "All done!" 

별도의 질문은 조금 까다 롭습니다. 정확히 무엇을 의미합니까? 무엇과 다른가요?

for ...; do 
    if diff -q $this_output $base_output; then 
     # files are identical 
     rm $this_output 
    fi 
done 

모든 고유 한 출력을 유지하려면이 알고리즘은 분명 조금 더 복잡하지만, 당신은 여전히 ​​동일한 출력을 테스트하기 위해 diff -q을 사용할 수 있습니다 : 당신이 기준이있는 경우, 당신은이 작업을 수행 할 수 있습니다. GNU 병렬 http://www.gnu.org/software/parallel/

2

wait를 호출 할 필요가 모든 프로세스가 완료되는 것을 나타냅니다

#!/bin/bash 
N=10 

for((i=1; j<=$N; ++i)); do 
    ./test > output-$N & 
done 
wait # wait until all jobs are finished 
echo DONE! 
1

당신은 할 수 있습니다 :

/tmp/test > base; seq 1 10 | parallel -k "/tmp/test >output-{}; if diff -q output-{} base; then rm {}; fi" ; echo DONE 

GNU 병렬 다른 물건에 유용합니다. GNU 병렬에 대한 소개 비디오보기 : http://www.youtube.com/watch?v=OpaiGYxkSuQ