2012-07-19 6 views
0

명령 행이 별도의 프로세스로 분산되는 간단한 병렬 처리를 구현하려고합니다. 나는 그것없이 명령에 리디렉션 또는 파이프를 사용할 수 있기 때문에 bash 스크립트를 사용하여 명령 줄 배포하기

(only "#! /bin/bash" and help message is omitted) 

slots=$1 
sel=$2 

[[ $slots -gt 0 ]] || die_usage 
[[ $sel -lt $slots ]] || die_usage 

i=0 
while read line 
do 
     ((i % slots == sel)) && eval $line 
     i=$((i + 1)) 
done 

# in case the last line does not end with EOL 
if [[ $line != "" ]]; then 
     ((i % slots == sel)) && eval $line 
     i=$((i + 1)) 
fi 

내가 eval을 넣어 :이를 위해 나는 jobsel 이름이 스크립트를 썼다.

cmds, 그것은 출력, 별도의 라인 0, 22, 44..., 예상대로 증가 숫자 echo 0 >> out 같은 라인이 들어있는 파일입니다 때이 콘솔 에뮬레이터 $HOME/util/jobsel 22 0 < cmds처럼이 실행

. 아직 까진 좋음.

그래서 나는 이것을 적용했습니다. 그러나 보안 셸을 통해 이것을 실행하면 at을 통해 백 그라운딩 (각 행은 &으로 끝남)으로 실행했습니다. 그런 다음 문제가 있습니다. 8 줄을 입력하면 21 개의 프로세스가 시작되었습니다! ps -AFH 인쇄 된 프로세스는 동일한 명령 및 다른 pID를 사용합니다. 모든 작업 프로세스는 init 아래에서 동일한 수준에있었습니다. 내 프로그램은 어쨌든 자식 프로세스를 생성하지 않습니다.

의아름, echo 0 >> out 스크립트를 통해 at을 통해 스크립트를 시도한 결과 출력에 중복 된 행이 포함되었습니다. 여전히 믿기 힘들다는 것을 알았고 동시에 추가가 동시에 일어난다 고 생각하면 예외적 인 원인이되었을 수 있습니다. 다른 방법을 사용하여 일부 줄이 여러 번 실행되었다는 것을 확인했습니다.

또한 모든 것이 터미널에서 실행될 때 또는 각 작업자 프로세스에 대해 별도의 at 작업을 만들 때 그러한 예외는 없었습니다.

하지만 어떻게 될 수 있습니까? 내 대본에 문제가 있습니까? at/atd에 버그가 있습니까?

+0

에 큰 결합 된 작동합니다'[[$ ((I %의 슬롯)) -eq $ SEL]'어떻게'((I %의 슬롯 == SEL))'. [Process Management] (http://mywiki.wooledge.org/ProcessManagement) 및 [BashFAQ/050] (http://mywiki.wooledge.org/BashFAQ/050)을 참조하십시오. –

+2

[GNU 병렬] (http://www.gnu.org/software/parallel/)을 사용 해본 적이 있습니까? –

+0

@DennisWilliamson 고맙습니다. 편집을 적용하고 있습니다. – h2kyeong

답변

2

GNU parallel은 구현하려는 것입니다.

힌트 : 그것은 xargs를

대신
관련 문제