2013-06-29 2 views
4

하나의 파일을 처리하는 스크립트가 10K 개이고 bash 개가 있다고 가정합니다. 이제 병렬로 실행되는 K 스크립트 만 사용하여이 모든 파일을 동시에 처리하고 싶습니다. 나는 (분명히) 한 번 이상 어떤 파일을 처리하고 싶지 않다.bash와 동시에 파일을 처리하는 방법은 무엇입니까?

bash에서 어떻게 구현 하시겠습니까?

+0

K가 너무 크지 않다면 다른 프로세스를 사용하십시오 – UmNyobe

답변

12

제한된 수의 병렬 작업을 실행하는 한 가지 방법은 GNU parallel입니다. 예를 들어,이 명령 :

find . -type f -print0 | parallel -0 -P 3 ./myscript {1} 

는 한 번에 myscript, 하나에 매개 변수로 현재 디렉토리 (및 하위 디렉토리)에있는 모든 파일을 전달합니다. -0 옵션은 분리 문자를 널 문자로 설정하고 -P 옵션은 병렬로 실행되는 작업 수를 설정합니다. 기본 병렬 프로세스 수는 시스템의 코어 수와 같습니다. here에 설명되어있는 클러스터 등에서 병렬 처리를위한 다른 옵션이 있습니다.

5

'('및 ')'을 사용하여 다른 프로세스에서 스크립트의 일부를 쉽게 실행할 수 있습니다. &을 추가하면 상위 프로세스는 하위를 기다리지 않습니다.

while ... do 
    (
     your script goes here, executed in a separate process 

    ) & 
    CHILD_PID = $! 
done 

을 그리고 또한 $! 당신에게 자식 프로세스의 PID를 제공합니다 : 그래서 당신은 실제로 (command1; command2; command3; ...) &를 사용합니다. 그 밖에 당신이 알아야 할 것이 무엇입니까? 실행 된 프로세스 k에 도달하면 다른 프로세스를 기다려야합니다. 이것은 wait <PID>를 사용하여 수행됩니다 :

wait $CHILD_PID 

당신이 그들 모두를 위해 대기 할 경우

, 그냥 wait를 사용합니다.

시스템을 구현하기에 충분해야합니다.

1
for f1 in *;do 
     ((cnt = cnt +1)) 
     if [ cnt -le $k ];then 
     nohup ./script1 $f1 & 
     continue 
     fi 
     wait 
     cnt=0 
    done 

테스트 해보십시오. dont '시간이

+0

이 단점은 일단 cnt 프로세스를 시작하면 * all *이 완료 될 때까지 다른 작업을 시작하지 않는다는 것입니다 . – chepner

관련 문제