무작위 간격으로 미리 정의된 수의 파일을 생성하는 다음과 같은 프로세스가 있습니다.
#!/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
터미널 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 -l
wc -l
for
루프가 최소 20초 동안 휴면 상태 이므로 저는 20초의 휴면 시간을 사용했습니다 . 필요에 맞게 절전 시간을 조정하세요. - 파일 생성 과정에 시간이 오래 걸리면 절전 시간을 늘려보세요. 정말 빠르면 줄이세요.