반응형

이번 포스팅에서는 GNU Parallel이 무엇인지, 그리고 이를 어떻게 사용하는지에 대해 알아보겠습니다. 특히, 병렬 처리가 필요한 작업에서 매우 유용하게 쓰일 수 있는 이 도구의 기능과 예시를 중심으로 설명하겠습니다.

GNU Parallel이란?

GNU Parallel은 많은 작업을 동시에 실행하거나, 여러 파일, 명령어, 데이터를 병렬로 처리할 수 있게 해주는 명령어 기반의 도구입니다. 대규모 데이터 처리, 반복적인 명령어 실행 등에서 CPU와 시스템 자원을 최대한 활용하여 작업을 더 빠르게 처리할 수 있게 도와줍니다.

주요 기능

  • 병렬 처리: 여러 개의 작업을 동시에 실행할 수 있습니다.
  • 동적 자원 관리: 시스템 자원(CPU, 메모리 등)에 따라 병렬 작업의 수를 조정할 수 있습니다.
  • 다양한 입력 방식: 파일, 표준 입력, 명령어 출력 등 다양한 방식으로 입력을 받을 수 있습니다.
  • 복구 기능: 작업이 중단된 경우, 마지막에 실행된 위치부터 작업을 재개할 수 있습니다.

GNU Parallel 설치 방법

GNU Parallel은 대부분의 배포판에서 기본적으로 설치되어 있지 않으므로, 다음 명령어를 통해 설치해야 합니다.

Ubuntu

sudo apt-get install parallel

macOS (Homebrew 사용 시)

brew install parallel

설치 후 parallel 명령어를 터미널에서 사용할 수 있습니다.


기본 사용법

GNU Parallel의 기본 구문은 아래와 같습니다:

parallel [옵션] 명령어 ::: 입력값1 입력값2 입력값3 ...
  • 명령어: 병렬로 실행할 명령어입니다.
  • :::: 뒤에 오는 값들은 각각의 작업에 대한 입력값입니다. 이 값들을 기준으로 병렬로 작업이 수행됩니다.

간단한 예시

parallel echo ::: Hello World GNU Parallel

이 명령어는 echo 명령어를 각각 "Hello", "World", "GNU", "Parallel"에 대해 병렬로 실행하게 됩니다.

출력 결과:

Hello
World
GNU
Parallel

실용적인 예시

1. 여러 파일에 대해 병렬로 명령어 실행하기

다음은 여러 파일에 대해 병렬로 작업을 수행하는 예시입니다. 예를 들어, 각각의 텍스트 파일에 대해 wc -l 명령어로 파일의 줄 수를 계산하고 싶을 때 사용할 수 있습니다.

parallel wc -l ::: file1.txt file2.txt file3.txt

이 명령어는 file1.txt, file2.txt, file3.txt에 대해 각각의 파일의 줄 수를 계산하는 작업을 병렬로 처리합니다.

2. 여러 디렉토리에 대해 스크립트 실행하기

디렉토리 내에 여러 하위 디렉토리가 있을 때, 각 디렉토리에 대해 특정 스크립트를 병렬로 실행할 수 있습니다.

ls -d */ | parallel -j 4 /bin/bash run.sh {}
  • -j 4: 동시에 4개의 작업을 병렬로 실행합니다.
  • ls -d */: 현재 디렉토리 내 하위 디렉토리를 나열합니다.
  • run.sh {}: 각 디렉토리(여기서 {}는 병렬 작업에 대한 인수로, parallel이 알아서 각각의 디렉토리 이름으로 대체합니다)에 대해 run.sh 스크립트를 실행합니다.

3. 원격 서버에서 병렬 작업 실행

GNU Parallel은 원격 서버에서도 병렬 작업을 실행할 수 있습니다. 여러 서버에서 명령어를 동시에 실행하고 싶을 때 유용합니다.

parallel -S server1,server2,server3 echo Hello ::: World
  • -S server1,server2,server3: 명령을 실행할 서버 목록을 지정합니다.
  • 각 서버에서 동시에 echo Hello 명령을 실행하고, 그 결과로 "World"를 출력합니다.

4. 대용량 파일 다운로드

여러 개의 파일을 병렬로 다운로드할 수 있습니다. 예를 들어, 아래는 세 개의 파일을 동시에 다운로드하는 예시입니다.

parallel wget ::: http://example.com/file1 http://example.com/file2 http://example.com/file3
  • wget 명령을 세 개의 파일에 대해 동시에 실행하여 병렬로 다운로드합니다.

고급 사용법

1. CPU 코어 수에 맞춰 작업 자동 병렬 처리

GNU Parallel은 시스템의 CPU 코어 수에 맞춰 자동으로 작업의 수를 조정할 수 있습니다. 이를 통해 시스템 리소스를 최적으로 활용할 수 있습니다.

parallel -j+0 echo ::: task1 task2 task3 task4
  • -j+0: CPU 코어 수에 맞춰 병렬 작업의 개수를 조정합니다. 예를 들어, 4코어 CPU에서는 4개의 작업을 동시에 처리합니다.

2. 작업 출력 관리

각 작업의 출력 결과를 별도의 파일로 저장할 수 있습니다. 아래는 각각의 작업 결과를 output1.log, output2.log 형식으로 저장하는 예시입니다.

parallel --results output echo ::: task1 task2 task3
  • --results output: 작업 결과를 output 디렉토리 하위에 로그로 저장합니다.

3. 중단된 작업 복구

대규모 작업을 수행하다가 중단되었을 경우, --resume 옵션을 사용하여 작업을 이어서 실행할 수 있습니다.

parallel --resume echo ::: task1 task2 task3 task4
  • 중단된 위치부터 작업을 재개합니다.

결론

GNU Parallel은 대규모 데이터 처리, 반복 작업, 시스템 자원의 효율적 사용이 필요한 환경에서 매우 유용한 도구입니다. 간단한 사용법으로도 병렬 작업을 쉽게 처리할 수 있으며, 복잡한 작업이나 고급 기능이 필요한 경우에도 매우 강력한 옵션을 제공합니다. 특히, 시스템 리소스를 최적화하고, 작업의 복구와 관리 기능을 지원하기 때문에 장기 작업에서도 신뢰할 수 있습니다.

필요에 따라 병렬 작업을 효율적으로 처리하고 싶다면, GNU Parallel을 적극적으로 활용해 보시기 바랍니다!

반응형
반응형

Argument받아서 처리하기




bash 스크립트로 argument를 여러 개 받아 해당 수 만큼 for loop을 돌릴 때 쓰는 방법이다.


전체 argument를 반복하고 싶다면 아래처럼 하면 된다.


for i in $@ ; do echo $i ; done 


특정 구간만을 반복시키고 싶다면 indexing을 넣어주어야 한다. 아래 예시는 2번부터 끝까지 반복이다.


for i in ${@:2} ; do echo $i ; done


2번부터 3번 반복하고 싶다면 (즉 2부터 4까지) 아래처럼 더 추가한다.


for i in ${@:2:3} ; do echo $i ; done



argument가 몇 개 인지 알고싶다면 "$#" 를 사용하면 된다.


argument가 0개 일때의 조건문.


if [ $# -eq 0 ] ; then

        echo "Number of argument is 0"

else 

        echo "Number of argument is $#"

fi





Reference -

https://stackoverflow.com/questions/255898/how-to-iterate-over-arguments-in-a-bash-script

https://stackoverflow.com/questions/4423306/how-do-i-find-the-number-of-arguments-passed-to-a-bash-script

반응형

+ Recent posts