리눅스에서 복사 진행률 보는 법: pv와 progress

리눅스 명령줄에서 대용량 파일 복사 시 진행률을 보고 싶다면 pv와 progress 두 유틸리티가 유용합니다. pv는 파이프에 삽입해 전송량·속도·ETA를 표시하고, progress는 실행중인 coreutils 기반 작업을 모니터링합니다. 사용 목적과 제약에 따라 하나를 선택하세요.
이 글은 리눅스 명령줄에서 파일 복사나 스트림 전송의 진행 상태를 시각적으로 확인하는 방법을 설명합니다. 그래픽 환경에서처럼 복사 상태를 기다리기만 하는 대신, 터미널에서 진행률 바(progress bar), 전송률, 경과 시간, ETA(예상 완료 시간) 등을 확인할 수 있는 두 가지 도구를 다룹니다: pv와 progress.
중요 용어 1줄 정의
- pv: 파이프를 통해 흐르는 데이터의 진행 상황을 보여주는 도구입니다. 표준 입력을 받아 표준 출력으로 전달하면서 진행 정보를 stderr에 표시합니다.
- progress: 이미 실행 중인 coreutils 계열(cp, mv, dd, tar 등) 프로세스를 검사해 진행 상태를 보여주는 모니터링 도구입니다.
왜 터미널에서 진행률이 필요할까
- 대용량 파일 전송은 시간이 많이 걸리고, 아무런 출력이 없으면 사용자는 작업이 멈췄는지 애매해집니다.
- 헤드리스 서버나 원격 SSH 세션에서는 GUI가 없으므로 터미널 출력이 전부입니다.
- 재시도/취소 결정을 더 정확히 내리려면 전송률과 ETA가 필요합니다.
중요: 이 문서의 예제는 Ubuntu 14.04에서 테스트된 내용이 포함되어 있으나, 대부분의 명령은 최신 Debian/Ubuntu 계열에서도 동일하게 동작합니다.
pv 설치와 기본 사용법
pv는 파이프라인 중간에 삽입해서 사용합니다. 기본적인 설치 명령(데비안/우분투 계열):
sudo apt-get install pv
간단한 사용 예제(디렉터리에 있는 파일을 gzip으로 묶어 데스크톱으로 저장):
tar -C /media/usbdrive -cf - images | pv -p -t -e -r | gzip > ~/Desktop/trip-pictures.tar.gz
주요 표시 항목 설명
- -p: 진행률 바만 표시
- -t: 경과 시간 표시
- -e: ETA(예상 남은 시간) 표시
- -r: 현재 전송률 표시
원문 예제처럼 와일드카드로 여러 파일을 처리할 때도 파이프라인 중간에 pv를 넣으면 안전합니다.
출력 제한과 대역폭 제한
- pv의 출력 형식을 제한하려면 표시 스위치를 사용하세요(예: -p만 사용하면 진행률 바만 보입니다).
- 전송 속도를 제한하려면 -L 옵션을 사용합니다. 예: 초당 5메가바이트로 제한:
pv -L 5m /media/usbdrive/largefile.iso > ~/largefile.iso
man 페이지에는 접미사 설명이 있습니다: k, m, g, t는 각각 1024배 단위입니다.
옵션 예시(요약)
- -L <속도>: 전송 속도 제한
- -W 또는 –wait: 첫 바이트가 전송될 때까지 기다린 후 진행률을 표시(수신 측 준비가 필요한 경우 유용)
- -p, -t, -e, -r: 각각 진행/시간/ETA/전송률
사용 시기 판단
- 파이프라인을 직접 구성할 수 있고, 전송작업의 양측(생성자 또는 소비자)을 제어할 수 있다면 pv가 직관적이고 가볍습니다.
progress 설치와 기본 사용법
progress는 이미 실행 중인 프로세스를 검사해 진행률을 보여줍니다. coreutils 명령의 진행률을 추정할 때 편리합니다.
전제: ncurses 개발 라이브러리가 필요합니다(스크립트 기반의 화면 표시를 위해).
설치 예(데비안/우분투 계열):
sudo apt-get install libncurses5-dev
프로젝트 복제 및 설치:
git clone https://github.com/Xfennec/progress.git
cd progress
make
sudo make install
설치 후 실행 예(모니터링 모드):
progress -m
화면 예시(이미지):
주요 옵션 요약
- -m: 모니터링 모드(실행 중인 프로세스가 있는 동안 루프)
- -M: 계속 모니터(절대 중단하지 않음)
- -c <명령>: 특정 명령 이름만 모니터(여러 번 사용 가능)
- -p
: 특정 PID만 모니터(여러 번 가능) - -i <파일경로>: 특정 파일을 무시
progress의 장점과 제약
- 장점: 이미 실행 중인 cp, mv, dd, tar 등의 작업을 명령을 바꾸지 않고 관찰할 수 있습니다.
- 제약: coreutils 계열에 기반한 작업에 한정되어 있고, 모든 유형의 스트림 파이프라인을 직접 추적하지는 못합니다.
pv와 progress 비교
아래 표는 실무에서의 선택을 돕기 위한 비교입니다.
기준 | pv | progress |
---|---|---|
설치 난이도 | 낮음(패키지 존재) | 보통(git 빌드 권장) |
사용법 | 파이프에 직접 삽입 필요 | 이미 실행 중인 프로세스 감시 |
| 지원 대상 | 모든 표준 스트림 파이프라인 | coreutils 계열 작업(예: cp, dd, tar) | 표시 항목 | 진행률, 속도, ETA, 경과시간 등 | 진행률, ETA, 속도, 다중 작업 모니터링 | 제약 | 명령을 수정해야 함 | 모든 타입의 명령을 추적하지 못함 |
결론적으로, 파이프라인 제어가 가능하면 pv를, 기존의 명령을 그대로 두고 모니터링만 하려면 progress를 선택하세요.
실제 사용 시나리오와 체크리스트
다음 역할별 체크리스트를 통해 어떤 도구를 선택할지 빠르게 결정할 수 있습니다.
시스템 관리자 체크리스트
- 원격 서버에서 대용량 백업 복사 확인이 필요한가? -> progress 우선
- 데이터 스트림을 파이프라인으로 구성해 처리하는가(예: tar | gzip | ssh)? -> pv 우선
- 전송 속도 제한이 필요한가? -> pv(-L)
- 장시간 모니터링이 필요한가? -> progress(-M)
데스크톱 사용자 체크리스트
- GUI 대신 터미널에서 간단히 복사 진행을 보고 싶은가? -> cp 대신 pv 활용: pv source > dest
- 여러 파일 묶음(tar) 전송 시 전체 ETA가 필요? -> tar -cf - dir | pv | gzip > file.tar.gz
개발자/CI 파이프라인 체크리스트
- 파이프라인 중 일부 단계의 처리 속도를 측정하려는가? -> pv로 각 파이프 단계에 삽입
- 테스트 자동화에서 표준 출력을 유지해야 하는가? -> pv는 stderr에 진행을 출력하므로 표준 출력 흐름은 보존됨
간단한 플레이북(표준 작업 흐름)
- 복사하거나 스트리밍할 데이터의 총 크기를 미리 파악한다(ls -lh, du -sh).
- 파이프라인을 구성한다. 데이터를 생성하는 쪽과 소비하는 쪽 사이에 pv를 삽입한다.
- 전송 속도를 제한해야 하면 -L 옵션을 추가한다.
- 원격 전송(ssh)을 할 경우 ssh 스트림에도 pv를 적용한다.
예: USB에서 로컬로 복사하면서 진행률 보기
pv /media/usbdrive/BigVideo.mp4 > ~/Videos/BigVideo.mp4
예: tar로 디렉터리 묶어서 압축하며 진행률 보기
tar -C /path/to/dir -cf - . | pv -s $(du -sb /path/to/dir | awk '{print $1}') | gzip > archive.tar.gz
위 예제에서 -s 옵션은 pv에게 전체 바이트 수를 알려주어 정확한 진행률을 계산하게 합니다.
문제 상황별 대응(트러블슈팅)
문제: 진행률이 전혀 올라가지 않음
- 원인 가설: 대상 디바이스(USB 등)가 슬로우 I/O 상태이거나, 파일 시스템 버퍼링으로 인해 표시가 지연될 수 있습니다.
- 점검 항목: iostat, dstat, vmstat로 디스크 I/O 상태 확인. 다른 프로세스가 I/O를 독점하는지 확인.
- 대응: 우선 기다리거나, 필요시 Ctrl+C로 중지하고 재시도. 재시도 시 pv -L로 속도 제한을 해 경쟁을 완화.
문제: progress가 아무 것도 표시하지 않음
- 원인 가설: progress는 coreutils 기반 작업만 추적합니다. 다른 사용자 프로그램이 파일을 쓰고 있다면 감지되지 않을 수 있습니다.
- 점검 항목: ps aux | grep <명령>로 해당 프로세스가 실제로 실행 중인지 확인.
테스트 케이스와 수용 기준
테스트 목적: pv와 progress가 전송 진행률을 정확히 보여주는지 확인
테스트 케이스 1: 단일 큰 파일 복사(pv)
- 절차: 1GB 테스트 파일 생성(dd if=/dev/zero of=test.img bs=1M count=1024), pv로 복사(pv test.img > /tmp/test.img)
- 기대 결과: pv가 진행률(퍼센트), 전송률, 경과시간, ETA를 stderr에 표시한다.
테스트 케이스 2: 이미 실행 중인 cp 작업 모니터(progress)
- 절차: 백그라운드에서 cp bigfile /tmp/ & 실행 후 progress -m 실행
- 기대 결과: progress가 해당 cp 프로세스의 진행률과 ETA를 목록에 표시한다.
수용 기준
- pv: 진행률 바와 ETA가 주기적으로 업데이트되어 사용자에게 전송 상태를 제공할 것.
- progress: coreutils 작업을 실행 중일 때 적어도 1개 이상의 해당 작업을 정확히 식별하고 진행률 정보를 제공할 것.
제한사항과 실패 사례
- pv는 파이프라인을 직접 수정해야 하므로 명령을 바꿀 수 없는 상황에서는 사용할 수 없습니다.
- progress는 모든 파일 시스템/파일 형식을 정확히 추적하지 못할 수 있습니다(예: 일부 네트워크 파일 시스템이나 특수 디바이스).
- 두 도구 모두 암호화된 스트림 내부의 논리적 진행(예: rsync 내부 알고리즘의 파일 단위 진행)을 직접 해석하지 않습니다.
보안 및 개인정보 주의
- USB나 외부 미디어에서 데이터를 읽을 때 해당 장치에 악성코드가 있거나 파일 시스템이 손상되어 있는지 주의하세요.
- 진행률 도구 자체는 데이터 내용을 유출하지 않지만, 시스템 로그나 화면 스크린샷에 민감한 파일명이 포함될 수 있으니 주의가 필요합니다.
실무 팁(현장에서 자주 쓰는 트릭)
- 파이프에서 총 바이트 수를 아는 경우 pv -s <바이트>를 사용하면 정확한 퍼센트와 ETA를 얻을 수 있습니다.
- ssh로 파일 전송 시 원격에서 tar를 풀고 로컬에서 pv로 전송하면 네트워크 전송 관찰이 가능합니다: ssh user@host “tar -C /path -cf - .” | pv | tar -xf -
- 전송 속도 제한으로 시스템 반응성을 유지하려면 pv -L을 적극 활용하세요.
의사결정 흐름(간단한 플로우차트)
flowchart TD
A[전송할 작업의 성격 확인] --> B{이미 실행 중인 작업인가}
B -- 예 --> C[progress로 모니터링]
B -- 아니오 --> D{파이프라인 제어 가능?}
D -- 예 --> E[pv 삽입하여 사용]
D -- 아니오 --> C
C --> F[모니터링 결과에 따라 중단/재시도 결정]
E --> F
비교 요약과 권장
- 단순 파이프 파이프라이닝 제어 가능 → pv 사용. 유연하고 속도 제한, 정밀 표시 가능.
- 이미 실행 중인 coreutils 작업을 관찰하고 싶을 때 → progress 사용. 명령을 변경할 필요 없음.
- 둘을 함께 쓰는 경우: 백그라운드에서 여러 파일 복사 작업을 progress로 모니터링하면서, 특정 스트림(압축·전송 단계)은 pv로 자세히 검사할 수 있습니다.
1줄 용어집
- ETA: Estimated Time of Arrival의 약자로, 완료까지 남은 시간을 의미합니다.
- I/O: Input/Output(입출력), 디스크나 네트워크와의 데이터 전송을 뜻합니다.
FAQ
pv와 progress 중 어느 쪽이 더 가볍나요
pv가 훨씬 가볍고 빠르게 설치되며, 패키지 저장소에 이미 있는 경우가 많습니다. progress는 ncurses 의존성과 빌드가 필요할 수 있습니다.
progress가 모든 복사 작업을 보여주지 않습니다. 이유는 뭔가요
progress는 coreutils 계열 명령의 방식(파일 크기 정보 등)에 의존해 추정합니다. 특수한 사용자 프로그램이나 네이티브 라이브러리를 사용하는 프로그램은 감지 대상에서 벗어날 수 있습니다.
pv 사용 시 정확한 퍼센트를 얻으려면 어떻게 해야 하나요
pv에 -s 옵션으로 전체 바이트 수(바이트 단위)를 알려주면 pv가 정밀한 퍼센트를 계산할 수 있습니다.
결론
pv와 progress는 목적이 겹치지만 사용 시나리오가 다른 도구들입니다. 파이프라인을 제어하거나 전송 속도를 제한해야 한다면 pv가 더 적합합니다. 이미 실행 중인 표준 복사/압축 작업의 진행 상태를 한눈에 보고 싶다면 progress가 편리합니다. 둘의 장단점을 이해하고 필요에 따라 조합해 사용하세요.
요약
- pv는 파이프라인 중간에 넣어 스트림 진행을 측정한다.
- progress는 실행 중인 coreutils 명령을 모니터링한다.
- 목적에 따라 도구를 선택하거나 병행 사용하면 실무에서 유용하다.