進捗確認のアプローチを整理する
大きなファイルのコピーや圧縮を実行すると、コマンドが何も表示しないまま処理が続くことがあります。「終わったのかどうか分からない」「あとどれくらい待てばよいか見当がつかない」という状況は、Linux 操作の初期によく経験します。
進捗を確認するアプローチは大きく 2 つに分かれます。
- 実行前にコマンドを組み替えて進捗を出力させる(pv・rsync のオプション指定など)
- すでに動いているプロセスに後から問い合わせる(progress コマンド・シグナル送信など)
それぞれの手順を順に見ていきます。
pv コマンドで転送量と速度を表示する
pv(Pipe Viewer)は、パイプを流れるデータ量・速度・経過時間・推定残り時間をリアルタイムで表示するツールです。コピーや圧縮のコマンドを「パイプでつなぐ」形に書き換えることで、進捗バーを追加できます。
インストールされていない場合は次のコマンドで導入します。
# Debian / Ubuntu 系
sudo apt install pv
# RHEL / AlmaLinux / Rocky Linux 系
sudo dnf install pv
ファイルをコピーしながら進捗を表示する
cp コマンド自体には進捗表示オプションがありません。pv を使うと次のように書けます。
pv /path/to/source.iso > /path/to/destination.iso
実行すると、転送済みのデータ量・速度・経過時間・推定残り時間が 1 行で更新され続けます。
tar で圧縮・展開しながら進捗を表示する
tar の圧縮・展開にも同様に組み込めます。
# 圧縮(ディレクトリを tar.gz にまとめる)
tar cf - /path/to/dir | pv | gzip > archive.tar.gz
# 展開
pv archive.tar.gz | tar xzf - -C /path/to/dest/
ファイルサイズが事前に分かっている場合は pv -s でサイズを指定すると、パーセンテージも表示されます。
pv -s $(stat -c%s /path/to/largefile) /path/to/largefile > /dest/largefile
rsync の進捗オプションを使う
rsync を使ったコピーや同期では、コマンド自体に進捗を表示するオプションが用意されています。
rsync -ah --progress /path/to/source /path/to/dest/
--progress を付けると、ファイルごとの転送バイト数・速度・残り時間が表示されます。-P は --partial --progress の短縮形で、中断した転送を再開する機能もあわせて有効になります。
rsync -ah -P /path/to/source /path/to/dest/
大量のファイルを転送する場合、ファイル単体の進捗ではなく全体の転送率を一覧したいときは --info=progress2 が便利です。
rsync -ah --info=progress2 /path/to/source/ /path/to/dest/
転送中のファイル名ではなく、全体の転送率・転送済みバイト数・残り時間が 1 行で更新表示されます。
すでに動いているプロセスの進捗を後から確認する
「オプションなしで cp や dd をすでに実行してしまった」という場合でも、進捗を確認できる方法があります。
progress コマンドを使う
progress は、実行中の coreutils コマンド(cp・mv・dd・tar・cat・gzip など)のプロセスを自動検出し、進捗を表示するツールです。
# Debian / Ubuntu 系
sudo apt install progress
# RHEL 系(EPEL リポジトリが必要な場合あり)
sudo dnf install progress
インストール後、別のターミナルから次のように実行します。
progress
実行中の対象プロセスが自動的に検出され、ファイルサイズと転送率が表示されます。継続的に更新し続けたい場合は -w(watch モード)を付けます。
progress -w
dd に USR1 シグナルを送る
dd コマンドは USR1 シグナルを受け取ると現在の転送状況を stderr に出力します。別ターミナルからプロセス ID を調べてシグナルを送れます。
# dd のプロセス ID を確認
pidof dd
# シグナルを送って進捗を出力させる
kill -USR1
なお、dd には status=progress オプションがあり、実行前に指定しておけばリアルタイムで進捗が表示されます。
dd if=/dev/sda of=/path/to/backup.img bs=4M status=progress
手法の使い分け
状況に応じた選び方を以下にまとめます。
- cp / tar にそのまま進捗を付けたい →
pvをパイプに挟む - rsync でファイルを転送したい →
--progressまたは--info=progress2を付ける - dd でディスクイメージを書き込みたい → 実行前に
status=progressを付ける - すでに動いているコピー・圧縮を監視したい →
progressコマンドを別ターミナルで実行する
よくあるつまずき
pv を挟んだのに進捗が表示されない
pv はパイプを流れるデータ量をもとに計算します。ディレクトリを直接 pv /path/to/dir のように指定しても動作しません。tar cf - dir | pv | ... のようにデータをパイプ経由で流す形に書き換えます。
progress コマンドが「No command found.」と表示する
対象の cp・tar などがすでに終了しているか、progress が対応していないコマンドが動いている場合に起こります。ps aux で対象プロセスが動いているか確認してから再実行します。
rsync の –progress でファイルごとの表示が流れすぎる
小さいファイルが大量にある場合、個別ファイルの進捗は流れが速くなりすぎて把握しにくくなります。そのときは --info=progress2 に切り替えると全体の転送率が 1 行で表示されます。
「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。
ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。
>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)
※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。
