![한 번에 여러 명령 실행](https://linux55.com/image/122562/%ED%95%9C%20%EB%B2%88%EC%97%90%20%EC%97%AC%EB%9F%AC%20%EB%AA%85%EB%A0%B9%20%EC%8B%A4%ED%96%89.png)
가능한 한 짧은 시간에 많은 수의 유사한 명령을 실행하고 사용 가능한 모든 리소스를 사용해야 합니다.
예를 들어 내 경우는 이미지를 처리하는 중인데 다음 명령을 사용하면 다음과 같은
for INPUT in *.jpg do; some_command; done
명령이 하나씩 실행되며 사용 가능한 모든 리소스를 사용하지 않습니다.
그러나 반면에 실행으로 인해 for INPUT in *.jpg do; some_command &; done
시스템의 리소스가 매우 짧은 시간에 부족해질 수 있습니다.
at
명령을 알고 있지만 batch
내 경우에 사용할 수 있는지 잘 모르겠습니다. 내가 틀렸다면 정정해주세요.
그래서 나는 명령을 일종의 대기열에 넣고 그 중 일부를 즉시 실행하려고 생각하고 있습니다. 이걸 빨리하는 방법을 모르겠어요, 그게 문제예요. 누군가가 이전에 비슷한 문제를 겪었을 것이라고 확신합니다.
조언해주세요.
답변1
GNU Parallel은 정확히 다음을 위해 설계되었습니다:
parallel some_command {} ::: *.jpg
기본적으로 각 CPU 코어는 하나의 작업을 실행합니다. 귀하의 경우 코어에 있는 작업보다 하나 더 많은 작업을 실행하고 싶을 수도 있습니다.
parallel -j+1 some_command {} ::: *.jpg
GNU Parallel은 동일한 컴퓨터 또는 SSH를 통해 액세스할 수 있는 여러 컴퓨터에서 작업을 병렬로 쉽게 실행할 수 있게 해주는 범용 병렬 처리기입니다.
4개의 CPU에서 32개의 서로 다른 작업을 실행하려는 경우 병렬화하는 간단한 방법은 각 CPU에서 8개의 작업을 실행하는 것입니다.
대신, GNU Parallel은 작업이 완료되면 새로운 프로세스를 생성하여 CPU를 활성 상태로 유지하여 시간을 절약합니다.
설치하다
보안상의 이유로 패키지 관리자를 사용하여 GNU Parallel을 설치해야 하지만 GNU Parallel이 배포용으로 패키지되어 있지 않은 경우 루트 액세스가 필요하지 않은 개인 설치를 수행할 수 있습니다. 이 작업은 10초 안에 완료할 수 있습니다.
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
다른 설치 옵션은 다음을 참조하세요.http://git.savannah.gnu.org/cgit/parallel.git/tree/README
더 알아보기
더 많은 예시 보기:http://www.gnu.org/software/parallel/man.html
소개 비디오 보기:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
이 튜토리얼을 살펴보세요:http://www.gnu.org/software/parallel/parallel_tutorial.html
지원을 받으려면 이메일 목록에 가입하세요.https://lists.gnu.org/mailman/listinfo/parallel
답변2
GNU make를 사용하고 --jobs
병렬로 실행하도록 선택할 수 있지만 지정된 작업 수에 대해서만 가능합니다. 이 숫자를 컴퓨터를 종료하지 않는 값으로 조정할 수 있습니다.
다음은 대상 ah(예: 출력 파일일 수 있음)를 취하고 각 대상에 대해 일련의 (더미) 명령을 실행하는 샘플 Makefile입니다.
all: a b c d e f g h
a b c d e f g h:
echo $@; sleep 10
명령 들여쓰기에 주의하세요~ 해야 하다TAB 문자입니다. 보다GNU make 문서Makefile 구문에 대한 자세한 정보입니다.
make를 호출하여 make --jobs 4
다음 출력을 얻을 수 있습니다( time make --jobs 4
아래에서 경과 시간을 표시하는 데 사용합니다).
echo a; sleep 10
echo b; sleep 10
echo c; sleep 10
echo d; sleep 10
b
a
c
d
echo e; sleep 10
echo f; sleep 10
echo g; sleep 10
e
f
echo h; sleep 10
g
h
real 0m20.009s
user 0m0.010s
sys 0m0.011s
처음 4개는 병렬로 실행되고 다음 4개는 병렬로 실행되므로 총 시간은 20초입니다.