하나의 파일을 처리하는 스크립트가 10K 개이고 bash
개가 있다고 가정합니다. 이제 병렬로 실행되는 K
스크립트 만 사용하여이 모든 파일을 동시에 처리하고 싶습니다. 나는 (분명히) 한 번 이상 어떤 파일을 처리하고 싶지 않다.bash와 동시에 파일을 처리하는 방법은 무엇입니까?
bash
에서 어떻게 구현 하시겠습니까?
하나의 파일을 처리하는 스크립트가 10K 개이고 bash
개가 있다고 가정합니다. 이제 병렬로 실행되는 K
스크립트 만 사용하여이 모든 파일을 동시에 처리하고 싶습니다. 나는 (분명히) 한 번 이상 어떤 파일을 처리하고 싶지 않다.bash와 동시에 파일을 처리하는 방법은 무엇입니까?
bash
에서 어떻게 구현 하시겠습니까?
제한된 수의 병렬 작업을 실행하는 한 가지 방법은 GNU parallel입니다. 예를 들어,이 명령 :
find . -type f -print0 | parallel -0 -P 3 ./myscript {1}
는 한 번에 myscript
, 하나에 매개 변수로 현재 디렉토리 (및 하위 디렉토리)에있는 모든 파일을 전달합니다. -0
옵션은 분리 문자를 널 문자로 설정하고 -P
옵션은 병렬로 실행되는 작업 수를 설정합니다. 기본 병렬 프로세스 수는 시스템의 코어 수와 같습니다. here에 설명되어있는 클러스터 등에서 병렬 처리를위한 다른 옵션이 있습니다.
'('및 ')'을 사용하여 다른 프로세스에서 스크립트의 일부를 쉽게 실행할 수 있습니다. &
을 추가하면 상위 프로세스는 하위를 기다리지 않습니다.
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
를 사용합니다.
시스템을 구현하기에 충분해야합니다.
for f1 in *;do
((cnt = cnt +1))
if [ cnt -le $k ];then
nohup ./script1 $f1 &
continue
fi
wait
cnt=0
done
테스트 해보십시오. dont '시간이
이 단점은 일단 cnt 프로세스를 시작하면 * all *이 완료 될 때까지 다른 작업을 시작하지 않는다는 것입니다 . – chepner
K가 너무 크지 않다면 다른 프로세스를 사용하십시오 – UmNyobe