GNU 병렬: 일부 파일을 사용할 수 있을 때 실행하고 나머지는 기다립니다.

GNU 병렬: 일부 파일을 사용할 수 있을 때 실행하고 나머지는 기다립니다.

무작위 간격으로 미리 정의된 수의 파일을 생성하는 다음과 같은 프로세스가 있습니다.

#!/bin/bash

for i in {1..10}
do
  sleep $(shuf -i 20-60 -n 1)
  echo $i > file_$i.txt
done

다음과 같이 GNU Parallel을 사용하여 각 파일에서 독립적으로 실행되는 또 다른 프로세스가 있습니다.

parallel wc -l ::: file_{1..10}.txt

예상한 대로 병렬 처리는 현재 사용 가능한 파일에서 실행됩니다. 나머지 파일을 사용할 수 있을 때까지 병렬로 대기하고 최대한 빨리 실행하는 방법이 있습니까?

답변1

보고 있다https://www.gnu.org/software/parallel/parallel_examples.html#example-gnu-parallel-as-queue-system-batch-manager

터미널 1:

true >jobqueue; tail -n+0 -f jobqueue | parallel -u

( -u이 옵션은 화면에 즉시 출력하려는 ​​경우 필수입니다. 그렇지 않으면 다음 작업이 완료될 때까지 출력이 지연됩니다. 두 경우 모두 작업이 즉시 실행됩니다.)

NO2. 터미널:

#!/bin/bash

for i in {1..10}
do
  sleep $(shuf -i 20-60 -n 1)
  echo $i > file_$i.txt
  echo file_$i.txt >> jobqueue
done

이 파일이 my_dir에 생성된 유일한 파일인 경우 확인하십시오.https://www.gnu.org/software/parallel/parallel_examples.html#example-gnu-parallel-as-dir-processor

inotifywait -qmre MOVED_TO -e CLOSE_WRITE --format %w%f my_dir |
  parallel -u echo

이렇게 하면 jobqueue파일이 필요하지 않습니다.

답변2

파일이 항상 1부터 10까지 순서대로 생성되는지 테스트하면 됩니다. file_10.txt예를 들어

   until [ -e file_10.txt ] ; do sleep 20 ; done
   parallel wc -l ::: file_{1..10}.txt

그렇지 않으면 일치하는 파일 수를 셀 수 있습니다.

numfiles=$(find . -name 'file*.txt' | wc -l)
while [ "$numfiles" -lt 10 ] ; do
  sleep 20
  numfiles=$(find . -name 'file*.txt' | wc -l)
done
parallel wc -l ::: file_{1..10}.txt

(참고: 파일 이름에 개행 문자가 포함되어 있으면 find줄 수가 계산되므로 파이프가 작동하지 않습니다.)wc -lwc -l

for루프가 최소 20초 동안 휴면 상태 이므로 저는 20초의 휴면 시간을 사용했습니다 . 필요에 맞게 절전 시간을 조정하세요. - 파일 생성 과정에 시간이 오래 걸리면 절전 시간을 늘려보세요. 정말 빠르면 줄이세요.

관련 정보