Linuxのパイプの流れの進捗を見守るには

時間のかかるコマンドをパイプをつないで実行したときに、パイプを流れるデータ量を進捗表示してくれると、ちゃんと動いていることが確認でき、残り時間も想像がつくので安心です。処理速度もリアルタイムにわかります。

そんなときはpvというコマンドを使います。

# 使用例

こんな感じで使えます。

```
$ COMMAND1 | pv | COMMAND2
10.1GiB 0:12:38 [9.92MiB/s] [                    <=>                            ]
```

左から、流れたデータ量、コマンドが始まってからの時間、データの流れる平均速度が数値で表示されます。

2か所以上のパイプを監視したい場合は次のように`-c`と`--name`を使います。

```
$ COMMAND1 | pv -c --name 1 | COMMAND2 | pv -c --name 2 | COMMAND3 | pv -c --name 3 | COMMAND4
        1: 22.2MiB 0:00:03 [6.78MiB/s] [  <=>                                   ]
        3: 1016KiB 0:00:03 [ 406KiB/s] [                   <=>                  ]
        2: 1.09MiB 0:00:03 [ 388KiB/s] [                   <=>                  ]
```

`-c`はpvを複数同時に使うときにそれぞれが端末上でちゃんと表示されるようにするために必須です。

`--name <NAME>`を指定すると進捗表示の左にラベルとして表示してくれるので、pvを複数同時に使うときには付けたほうが見やすいです。付けないとどの進捗表示がどのパイプのことなのかがわからないです。上の例のように順番通りにならない場合もあります。

pvはcatコマンドと同等に標準入力をそのまま標準出力するので、以下のようにリダイレクトもできます。入力の全体のデータ量がわかる場合は、進捗のパーセント表示も右端に表示されます。

```
$ pv -c --name in < input.txt | COMMAND2 | pv -c --name out > output.txt
       in:  949MiB 0:00:11 [85.2MiB/s] [==================>     ] 60% ETA 0:00:07
      out: 48.2MiB 0:00:11 [4.41MiB/s] [           <=>                          ]
```


# インストール

## CentOS

CentOSにはyumにはないようでして、rpmを直接インストールします。

rpmのURLはpv公式サイト
http://www.ivarch.com/programs/pv.shtml
で確認できます。最新バージョンのrpmのURLをここで確認してください。

```
$ sudo rpm -ivh http://www.ivarch.com/programs/rpms/pv-1.6.6-1.x86_64.rpm
...
$ pv --version
pv 1.6.6 - Copyright 2015 Andrew Wood <andrew.wood@ivarch.com>

Web site: http://www.ivarch.com/programs/pv.shtml

This program is free software, and is being distributed under the
terms of the Artistic License 2.0.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```

2019年10月現在、CentOS 7で確認しました。
2021年1月現在、CentOS 8でも確認しました。


## Ubuntu

Ubuntuにはaptでインストールできます。

```
$ sudo apt update
...
$ sudo apt install pv
...
$ pv --version
pv 1.6.6 - Copyright 2015 Andrew Wood <andrew.wood@ivarch.com>

Web site: http://www.ivarch.com/programs/pv.shtml

This program is free software, and is being distributed under the
terms of the Artistic License 2.0.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```

2019年10月現在、Ubuntu 18.04で確認しました。
2021年1月現在、Ubuntu 20.04でも確認しました。


# オプション

```
$ pv --help
Usage: pv [OPTION] [FILE]...
Concatenate FILE(s), or standard input, to standard output,
with monitoring.

  -p, --progress           show progress bar
  -t, --timer              show elapsed time
  -e, --eta                show estimated time of arrival (completion)
  -I, --fineta             show absolute estimated time of arrival
                           (completion)
  -r, --rate               show data transfer rate counter
  -a, --average-rate       show data transfer average rate counter
  -b, --bytes              show number of bytes transferred
  -T, --buffer-percent     show percentage of transfer buffer in use
  -A, --last-written NUM   show NUM bytes last written
  -F, --format FORMAT      set output format to FORMAT
  -n, --numeric            output percentages, not visual information
  -q, --quiet              do not output any transfer information at all

  -W, --wait               display nothing until first byte transferred
  -D, --delay-start SEC    display nothing until SEC seconds have passed
  -s, --size SIZE          set estimated data size to SIZE bytes
  -l, --line-mode          count lines instead of bytes
  -0, --null               lines are null-terminated
  -i, --interval SEC       update every SEC seconds
  -w, --width WIDTH        assume terminal is WIDTH characters wide
  -H, --height HEIGHT      assume terminal is HEIGHT rows high
  -N, --name NAME          prefix visual information with NAME
  -f, --force              output even if standard error is not a terminal
  -c, --cursor             use cursor positioning escape sequences

  -L, --rate-limit RATE    limit transfer to RATE bytes per second
  -B, --buffer-size BYTES  use a buffer size of BYTES
  -C, --no-splice          never use splice(), always use read/write
  -E, --skip-errors        skip read errors in input
  -S, --stop-at-size       stop after --size bytes have been transferred
  -R, --remote PID         update settings of process PID

  -P, --pidfile FILE       save process ID in FILE

  -d, --watchfd PID[:FD]   watch file FD opened by process PID

  -h, --help               show this help and exit
  -V, --version            show version information and exit

Please report any bugs to <pv@ivarch.com>.
```

# 関連

`-L`オプションでパイプの流速を制限できます。

[Linuxのパイプの流れる速度を制限するには](https://suzuki-navi.hatenablog.com/entry/2021/01/17/203303)