Bash만으로 동시성 제한 명령 큐를 만든 방법

Concurrent Shell Command Queues

Bash만으로 동시성 제한 명령 큐를 만든 방법

Bash에서 스레드 풀처럼 동시 실행 수를 제한하는 명령 큐를 구현하는 방법을 소개한다. mkfifo로 큐 파일을 만들고 xargs -P로 동시성을 관리하는 queue_start, queue_submit, queue_wait 세 함수로 구성되며, 실행할 명령을 미리 알 필요 없이 시간에 따라 제출할 수 있다. Bash와 Zsh에서 동작하고 서브셸 간 큐 상속도 지원하지만, 셸당 큐 하나, 출력 스트리밍 불가, 종료 시 하위 프로세스 일괄 종료 같은 한계도 있다. 저자는 Bash에 대한 애정으로 도전했을 뿐, 솔직히 Python 같은 언어가 낫다고 인정한다.

당신이 옳습니다. 그리고 제 답은 이렇습니다. 저는 Bash를 좋아하고, 그 도전이 하고 싶었기 때문입니다. 그래도 아마 Python 같은 다른 언어를 쓰는 편이 더 나을 겁니다.
  1. js2

    > 셸 명령을 병렬로 실행하면서 동시성을 제한하는 방법.

    작업에 따라 Makefile을 생성하고 다음으로 실행하세요:

    make -j <concurrency>

    > 제 원래 사용 사례는 대량의 웹 요청을 만드는 것과 관련이 있었습니다

    사실 이 사용 사례 때문에 아마 20년 전쯤 Makefile을 동시성에 사용할 생각을 했던 것 같습니다. 각 URL을 파일로 다운로드하는 규칙을 만듭니다. 그런 다음 간단히 `make -j <jobs>`를 원하는 동시성으로 실행하면 되고, 보너스로 이미 다운로드된 파일은 자동으로 건너뜁니다. 예:

    BASE := https://example.com/files

    FILES := a.txt b.txt c.txt d.txt e.txt

    .DELETE_ON_ERROR:

    all: $(FILES)

    $(FILES):

    curl -sS --fail --max-time 30 -o $@ $(BASE)/$@

    또는 블로그 글의 예제 중 하나를 흉내내려면:

    SHELL := bash

    .SHELLFLAGS := -o pipefail -c

    N := 1 2 3 4 5

    REQS := $(N:%=req-%)

    .PHONY: all $(REQS)

    all: $(REQS)

    $(REQS): req-%:

    @curl -sS --fail-with-body --max-time 10 -X POST -H 'Content-Type: application/json' \

    -d '{"request": $*}' https://postman-echo.com/post | jq -c .json

    다음으로 실행:

    $ make -O -j 3

    > 실행하고자 하는 모든 명령을 미리 알 필요는 없으며, 시간이 지나면서 명령을 제출할 수 있습니다.

    아, 그래요, 그러면 Make는 `xargs -P` / GNU `parallel`과 같은 범주에 속하고 더 영리한 무언가가 필요하겠네요.

  2. reconquestio

    GNU Parallel의 sem도 있습니다: https://www.gnu.org/software/parallel/sem.html

    sem --id jobs -j 2 'sleep 1; echo FIRST'

    sem --id jobs -j 2 'echo SECOND'

    sem --id jobs -j 2 'echo THIRD'

    sem --id jobs --wait

    SECOND

    THIRD

    FIRST

  3. 0cf8612b2e1e

    저는 이런 용도로 pueue를 정말 좋아합니다. 가벼운 slurm이나 parallel 같으면서도 인용 공지가 귀찮게 나오지 않죠.

    https://github.com/Nukesor/pueue

이 날의 다른 글

2026-11-13