한 번에 여러 명령 실행

한 번에 여러 명령 실행

가능한 가장 빠른 시간 내에 사용 가능한 모든 리소스를 사용하여 유사한 명령을 많이 실행해야 합니다.

예를 들어 내 경우는 다음 명령을 사용할 때 이미지를 처리하는 중입니다. 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 병렬 스케줄링

설치

보안상의 이유로 패키지 관리자를 사용하여 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

NB 명령 들여쓰기~ 해야 하다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초입니다.

관련 정보