pv と progress でコマンドライン進捗を可視化

重要: 以下のコマンドや手順は主に Debian/Ubuntu 系で検証されています。root 権限や対象ファイルへの読み取り権限が必要な場合があります。
なぜコマンドラインでも進捗が欲しいのか
大きなファイルをコマンドラインでコピーしていると、何分も変化がないように見えることがあります。GUI のコピーでは進捗バーやETAが表示されるのに対し、ターミナルでは単にコマンドが動作しているだけで状態が分かりづらい。pv と progress はそうした不安を解消してくれます。
定義(1行): pv はパイプのデータフローを可視化するツール。progress は実行中プロセスを監視して進捗を推定するツール。
基本的な違いと選び方
- pv: コマンドラインでデータを流すパイプに差し込んで使う。コマンド自体を変える必要あり。あらゆるストリームに使える。転送速度制限や総サイズを指定できる。
- progress: 既に動いている coreutils 系コマンド(cp、mv、dd、tar、gzip、cat など)をプロセス単位で監視できる。既存のコマンドを修正せずに使える。
使い分けの簡易判断: コマンドを変更してもよいなら pv、既に走っている/修正できないプロセスを監視したいなら progress。
pv コマンド
pv はパイプを流れるデータ量を測定・表示します。表示される情報は経過時間、進捗(パーセンテージとバー)、スループット、転送済み合計、ETA などです。pv の標準入力はそのまま標準出力へ渡され、進捗は標準エラーに出力されます。
インストール(Debian/Ubuntu):
sudo apt-get install pv
macOS ユーザーは Homebrew を使っている場合、brew で入手できることが多いです(環境に依存します)。
基本例: USB ドライブ内のディレクトリを gzip で圧縮しつつ転送する例:
pv /media/himanshu/1AC2-A8E3/Maldives-2016/* | gzip > ./Desktop/trip-pictures.gz
上の例では pv がパイプ中のデータを監視し、進捗と転送率を表示します。
表示オプションの例:
- -p: 進捗バーのみ表示
- -W または –wait: 最初のバイト転送まで待ってから進捗表示や ETA 計算を始める
- -L <速度>: 転送速度を制限する(例: 5m は 5 メガバイト/秒)
- -s <サイズ>: 総サイズを指定して正確なパーセンテージを計算する
速度制限の例(5MB/s に制限):
pv -L 5m /media/himanshu/1AC2-A8E3/Maldives-2016/* | gzip > ./Desktop/trip-pictures.gz
総サイズを手動で与えてパーセンテージを有効にする例(総サイズが 10GB のとき):
pv -s 10G bigfile.img > bigfile.img.copy
実用的な pv の使い方(dd と組み合わせてブロック単位で進捗表示):
dd if=/dev/zero bs=1M count=1024 | pv -s 1G | dd of=/tmp/testfile bs=1M
pv の利点:
- 任意のストリームに挿入できる汎用性
- スループット制限や総サイズ指定で細かく制御可
- パイプ処理を行うツールやスクリプトに自然に組み込める
pv の注意点:
- 監視対象プロセスを直接列挙はできない(パイプに手を入れる必要がある)
- 一部のツールや特殊デバイスでは期待通りにバイト数が報告されないことがある。そうした場合は -s で総サイズを与えるのが有効。
progress コマンド
progress は(以前の名称は cv)実行中の coreutils ベースのコマンドを監視して進捗を表示します。cp、mv、dd、tar、gzip/gunzip、cat などを自動で検出して、推定時間やスループットを示します。top のような監視モードもあります。
事前準備: progress は ncurses ライブラリを利用するため、ビルド時に libncurses が必要です。Debian/Ubuntu では次をインストールします:
sudo apt-get install libncurses5-dev
インストール手順(GitHub からビルド):
git clone https://github.com/Xfennec/progress.git
cd progress
make
sudo make install
インストール後、progress を実行すると、複数の進行中プロセスがリスト表示されます。
主なオプション(実用的な例のみ):
- -m –monitor: 監視対象プロセスが動いている間ループして表示
- -M –monitor-continuously: 終了せずに常時監視(watch に似た動作)
- -c –command cmd: コマンド名で絞り込み(複数指定可)
- -p –pid id: プロセスIDで絞り込み(複数指定可)
- -i –ignore-file file: このファイルの処理は無視する(フルパスが必要)
progress の利点:
- 既に実行中の coreutils 系コマンドを修正せずに監視できる
- 複数プロセスを一括で一覧監視できるため、サーバでの大規模コピーを把握しやすい
progress の注意点:
- coreutils 系以外のプロセス(独自バイナリや一部のアプリ)では検出できないことがある
- 他ユーザーのプロセスを監視するには十分な権限が必要
実用例とユースケース
- 大容量イメージをコピーしつつ進捗を表示したい(pv):
pv -s 50G /path/to/large.img > /mnt/backup/large.img
ここで -s 50G は総サイズを与えることで正確なパーセンテージを得る。
- 別ターミナルから現在走っている cp/mv の進捗を一覧で見たい(progress):
progress -m
- スループットを制限してネットワーク帯域を守りつつ転送(pv):
tar cf - source_dir | pv -L 5m | ssh user@host 'cat > /backup/source_dir.tar'
- dd によるディスクイメージ作成の進捗を後で確認したい(progress):
ターミナル A で dd を実行。ターミナル B で progress を実行すれば検出されることが多い。
トラブルシューティングと制限例
- 何も表示されない: pv をパイプに入れているか、progress が監視対象プロセスを検出できているか確認する。
- 権限エラー: 他ユーザーのプロセスやブロックデバイスへアクセスする場合、root 権限が必要になることがある。
- 不正確な ETA: 圧縮や暗号化などバイト数と実際の進捗が非線形な処理では ETA がずれる。こうした場合は ETA を参考情報として扱う。
- GUI と比べて検出できないケース: progress は coreutils 系に強いが、アプリケーション固有の I/O では検出できないことがある。
例外的に失敗する場面(カウンター例):
- パイプラインの途中でバッファリングが強く効いていると、pv の表示が一時的に停止するように見えることがある(内部バッファが先に埋まってしまうため)。
- ネットワーク遅延や NFS マウントの特性により、pv の表示が断続的になることがある。
選択のための簡易意思決定ツリー
flowchart TD
A[コピー/転送を開始する前か後か?] -->|開始前| B[pv を検討]
A -->|既に実行中| C[progress を検討]
B --> D{パイプを編集できるか}
D -->|はい| E[pv を使う: 細かな制御, 速度制限可]
D -->|いいえ| C
C --> F{対象は coreutils 系か}
F -->|はい| G[progress で監視]
F -->|いいえ| H[ログ/アプリ固有の方法を検討]
役割別チェックリスト
システム管理者:
- pv と progress のインストール手順を確認
- 監視スクリプトやログローテーションに組み込む
- 他ユーザーのコピーを安全に監視するための権限ポリシーを定義
開発者/運用エンジニア:
- ビルドパイプラインやデプロイ時に pv を使ってアーティファクト転送を可視化
- CI/CD のログに pv 出力を残す(失敗時の切り分けに有効)
一般ユーザー:
- 慣れていない場合はまず小さなファイルで試験運用
- root 権限がないと監視できないケースがあることを理解
セキュリティとプライバシーの注意点
- progress は /proc を参照してプロセス情報を得るため、他ユーザーのプロセスやファイルにアクセスする場合は権限に注意する。管理者が誤って他のユーザー操作を監視しないようポリシーを設けること。
- pv 自体は単にデータを中継するツールであり、秘密情報を漏らすものではないが、パイプ中のデータは pv の実行者権限を持つ環境でクリアテキストとして扱われる点に注意する。
使い方のチートシート
- 基本インストール(Debian/Ubuntu): sudo apt-get install pv, libncurses5-dev(progress のビルド用)
- パイプに挿入: command1 | pv | command2
- 速度制限: pv -L 5m
- 総サイズ指定: pv -s 10G
- 監視モード: progress -m
- コマンド絞り込み: progress -c cp -m
1行用語集
- ETA: 推定残り時間(Estimated Time of Arrival の省略表現)
- スループット: 単位時間あたりのデータ転送量
- パイプ: Unix 系でプロセス間の標準入出力接続(|)
よくある質問
Q: pv と progress を同時に使うメリットは?
A: pv はデータフローに直接入れられるため正確なバイト数を取れ、progress は複数プロセスを横断的に監視できる。両者を状況に応じて使い分けると便利。
Q: 他の OS でも使えますか?
A: pv は多くの Unix 系でパッケージ化されています。progress はソースからビルドする手順が一般的で、環境依存のライブラリが要る場合があります。
Q: ETA はどれくらい信用できますか?
A: 圧縮や暗号化など処理内容によって変動するため参考値として扱ってください。転送速度が安定している場合は比較的正確です。
まとめ
- pv と progress は目的が異なる補完的なツール。pv はパイプを対象に詳細に可視化、progress は既存プロセスを外から監視する。
- インストールは簡単だが、権限や監視対象の種類によって動作が変わるので事前検証が重要。
- 実務では両方を状況に応じて使い分け、長時間のファイル操作の不安を減らすのが最良のアプローチ。
最後に短い運用メモ: 重要なバックアップや大容量コピーは、pv で速度制限とログ出力を併用し、別ターミナルで progress を走らせて全体を監視するとトラブル対応が容易になります。