우분투 실전 명령어 | xargs -P로 배치 작업 병렬 처리하기
언제 쓰는가
파일 변환, API 호출, 이미지 처리처럼 같은 명령을 여러 입력에 반복할 때 씁니다.
순차 실행으로 너무 오래 걸릴 때 xargs -P로 병렬 개수를 제한하면, 서버를 과부하시키지 않으면서 처리 시간을 크게 줄일 수 있습니다.
바로 쓰는 명령어
# URL 목록을 최대 4개씩 병렬로 헬스체크
cat urls.txt | xargs -n1 -P4 -I{} sh -c 'curl -fsS --max-time 3 "{}" >/dev/null && echo "OK {}" || echo "FAIL {}"'
#!/usr/bin/env bash
set -euo pipefail
find /data/incoming -type f -name '*.csv' -print0 \
| xargs -0 -n1 -P3 -I{} sh -c '
in="$1"
out="/data/converted/$(basename "$in" .csv).json"
csvkit csvjson "$in" > "$out"
echo "converted: $in"
' _ {}
핵심 옵션과 패턴
-n1: 한 번에 입력 1개씩 처리합니다. 실패 지점을 찾기 쉽고 로그가 깔끔합니다.-P4: 최대 동시 작업 수를 4로 제한합니다. CPU/IO 여유에 맞춰 조절합니다.-0+-print0: 공백·한글·특수문자가 있는 파일명도 안전하게 처리합니다.-I{}: 입력값을 명령 문자열 안 원하는 위치에 치환합니다.
# CPU 코어 수 기준으로 병렬 수 자동 설정
P=$(nproc)
find ./jobs -type f -name '*.task' -print0 | xargs -0 -n1 -P"$P" ./run-task.sh
# 장애 시 즉시 중단하고 싶다면 GNU parallel 대안도 검토
# (xargs는 기본적으로 나머지 작업을 계속 진행할 수 있음)
명령 출력 예시
$ cat urls.txt | xargs -n1 -P4 -I{} sh -c 'curl -fsS --max-time 3 "{}" >/dev/null && echo "OK {}" || echo "FAIL {}"'
OK https://api.example.com/health
FAIL https://api2.example.com/health
OK https://api3.example.com/health
OK https://api4.example.com/health
$ find /data/incoming -type f -name '*.csv' -print0 | xargs -0 -n1 -P3 ./convert-one.sh
converted: /data/incoming/orders_2026-02-18.csv
converted: /data/incoming/users_2026-02-18.csv
converted: /data/incoming/events_2026-02-18.csv
자주 하는 실수
find ... -print0없이xargs -0만 써서 입력 파싱이 깨지는 경우가 많습니다.- 병렬 수를 너무 크게 잡아 API rate limit이나 디스크 병목을 스스로 만드는 경우가 있습니다.
- 하위 명령 실패를 로그로만 남기고 종료 코드를 확인하지 않아 배치 성공으로 오판하기 쉽습니다.
- 출력 파일 경로가 겹치는데 병렬 실행해 레이스 컨디션이 생기는 경우가 있습니다.
검증 방법
# 테스트 파일 20개 생성
mkdir -p /tmp/xargs-demo && cd /tmp/xargs-demo
seq 1 20 | xargs -I{} sh -c 'echo "{}" > file_{}.txt'
# 병렬 처리 + 처리 시간 확인
/usr/bin/time -p find . -name 'file_*.txt' -print0 \
| xargs -0 -n1 -P4 -I{} sh -c 'sleep 1; wc -c "$1" >/dev/null' _ {}
# 실패 전파 확인
printf '%s\n' ok1 fail ok2 | xargs -n1 -P2 -I{} sh -c '
[ "$1" = fail ] && exit 7 || exit 0
' _ {}
echo "exit=$?"
exit 값이 0이 아니면 실패가 섞였다는 뜻이니, 배치 스크립트에서 이 값을 반드시 체크해야 합니다.
운영 팁
초기에는 -P2처럼 보수적으로 시작하고, CPU 사용률·iowait·에러율을 보면서 단계적으로 올리는 게 안전합니다.
운영 배치에서는 입력 분할 단위와 재시도 정책을 함께 설계해 두면, 대량 실패 때 복구 시간이 크게 줄어듭니다.
출처
- GNU findutils Manual
- Ubuntu Manpages
- The Linux Programming Interface