全力で怠けたい

怠けるために全力を尽くしたいブログ。

パイプを通るデータの進捗をモニタリングする pv コマンドでよくやる使い方とオプションのメモ。

パイプを通るデータの進捗をモニタリングする pv コマンドでよくやる使い方とオプションのメモ。

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.

pv コマンドでよくやる使い方とオプション

pv コマンドはパイプを通るデータの進捗、たとえばパイプを通ったデータサイズ・パイプを通る速度・進捗とかをモニタリングするコマンド。

だいたいのときはオプションとかは指定しないでただ pv を実行するだけで事足りるけどオプションを指定すると出力する内容とかをかなり細かく指定できる。 そのへんをざっくりとメモしておく。

インストール

Macbrew で pv コマンドをインストールできる。

$ brew install pv

Ubuntu なら apt で pv コマンドをインストールできる。

$ sudo apt install pv

使い方

基本的な使い方

任意のコマンドをパイプで pv コマンドに接続して任意のコマンドが出力しているデータサイズなどを表示する。

たとえば cat /dev/zero | pv > /dev/null みたいに実行すると cat コマンドで /dev/zero を標準出力に流すのをモニタリング表示する。

$ cat /dev/zero | pv > /dev/null
11.4GiB 0:00:04 [2.85GiB/s] [      <=>                               ]

pv コマンドを使うときはモニタリングするコマンドの表示は興味がないことが多いのでコマンドの出力は /dev/null にリダイレクトしちゃうことが多いけど、pv コマンドは標準入力から読み込んだデータをそのまま標準出力に書き出すので コマンドを pv コマンドのあとに接続することもできる。

$ cat /dev/zero | pv | tr '\0' 'a' | fold -w 40 | head -n 1
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 128KiB 0:00:00 [15.6MiB/s] [ <=>                                    ]

pv コマンドは pv [OPTION] [FILE] ... みたいにファイルを指定して cat コマンドみたいに実行することもできる。

$  pv /dev/zero > /dev/null
 151GiB 0:00:06 [24.4GiB/s] [         <=>                            ]

pv コマンドの表示の見方

pv コマンドはデフォルトでは通過したデータサイズ、経過時間、データの通過速度、プログレスバーとコマンドの完了までの予想残り時間を表示する。

$ cat /dev/zero | pv > /dev/null
11.4GiB 0:00:04 [2.85GiB/s] [      <=>                               ]

この実行例は 11.4GiB が通過したデータサイズ、0:00:04 が経過時間、2.85GiB/s がデータの通過速度、[ <=> ]プログレスバー。 あとこの実行例は pv コマンドが総データサイズを確定できないのでコマンドの完了までの予想残り時間は表示していない。

こんな感じで pv コマンドをパイプの先頭に実行すると pv コマンドが総データサイズを確定できてコマンドの完了までの予想残り時間を表示する。

$ pv large.log | gzip > large.log.gz
1.00GiB 0:00:06 [ 157MiB/s] [==============================>         ] 48% ETA 0:00:02  

pv コマンドでパイプのなかの2箇所以上をモニタリングする

pv コマンドはパイプのなかの何箇所でもモニタリングできる。

pv コマンドでパイプの中の2箇所以上をモニタリングするときは -c オプションと -N オプションを指定すると表示が見やすくなる。 -C オプションを指定するとモニタリングしてるすべての箇所が常に表示して、 -N オプションで適当なプリフィックスを指定すると指定したプリフィックスがそれぞれのモニタリングのところに表示する。

$ cat /dev/zero | pv -c -N cat | tr '\0' 'a' | pv -c -N tr | fold -w 60 | pv -c -N fold > /dev/null
      cat: 1.05GiB 0:00:07 [ 137MiB/s] [           <=>               ]
       tr: 1.05GiB 0:00:07 [ 137MiB/s] [           <=>               ]
     fold: 1.07GiB 0:00:07 [ 139MiB/s] [           <=>               ]

pv コマンドのよく使うオプション

-h, --help オプション: ヘルプ

-h オプションか --help オプションを指定すると pv コマンドの使い方を表示する……んだけど man pv が使えないときにしか使わない。

-c, --cursor オプション: カーソル位置のエスケープシーケンスを使う

-c オプションか --cursor オプションを指定すると pv コマンドがモニタリングの表示にカーソル位置のエスケープシーケンスを使う。

pv コマンドで長いパイプラインの2箇所以上をモニタリングするときは必ず指定するくらいのオプション。

-N, --name オプション: プリフィックスを表示する

-N オプションか --name オプションでプリフィックスを指定するとモニタリングの表示の前に指定したプリフィックスを表示する。

pv コマンドで長いパイプラインの2箇所以上をモニタリングするときは必ず指定するくらいのオプション。 -N オプションも --name オプションも指定しないときはこんな感じでモニタリング表示するけど、

$ cat /dev/zero | pv -c | tr '\0' 'a' | pv -c | gzip | pv -c > /dev/null
 1.05GiB 0:00:07 [ 137MiB/s] [           <=>                         ]
 1.05GiB 0:00:07 [ 137MiB/s] [           <=>                         ]
 1.07GiB 0:00:07 [ 139MiB/s] [           <=>                         ]

-N オプションか --name オプションでプリフィックスを指定するとこんな感じでプリフィックスがモニタリングの前に表示するので、モニタリングの表示がパイプラインのどの箇所のものかが分かりやすくなる。

$ cat /dev/zero | pv -c -N cat | tr '\0' 'a' | pv -c -N tr | fold -w 60 | pv -c -N fold > /dev/null
      cat: 1.05GiB 0:00:07 [ 137MiB/s] [           <=>               ]
       tr: 1.05GiB 0:00:07 [ 137MiB/s] [           <=>               ]
     fold: 1.07GiB 0:00:07 [ 139MiB/s] [           <=>               ]

-i, --interval オプション: 表示を更新する間隔を指定する

pv コマンドはデフォルトは1秒ごとにモニタリング表示を更新するけど、-i オプションか --interval オプションでモニタリング表示を更新する間隔を指定できる。

-i オプションと --interval オプションは 0.1 みたいに 0 から 1 の範囲で10進数で指定する。

`-i 0.3P みたいに指定すると 0.3 秒間隔でモニタリング表示を更新する。

$ cat /dev/zero | pv -i 0.3 > /dev/null
13.4GiB 0:00:02 [2.97GiB/s] [              <=>                       ]

-L, --rate-limit オプション: データの通過バイトを制限する

-L, オプションか --rate-limit オプションで1秒間あたりでのデータの通過バイト数を制限する。

自分の環境は pv コマンドを -L オプションを指定しないときは cat /dev/zero すると1秒間あたり 2.70GiB くらいのデータが pv コマンドを通過するけど、

$ cat /dev/zero | pv > /dev/null
11.0GiB 0:00:04 [2.70GiB/s] [      <=>                               ]

-L 100 みたいにすると1秒間あたりのデータの通過バイトを100バイトに制限する。

$  cat /dev/zero | pv -L 100 > /dev/null
 300 B 0:00:03 [98.7 B/s] [     <=>                                  ]

-L, オプションか --rate-limit オプションは 1K みたいにバイト数の単位を指定することができる。

たとえば -L 1024 みたいに指定するのは -L 1K みたいに同じ意味を短く指定できる。

$  cat /dev/zero | pv -L 1K > /dev/null
10.0KiB 0:00:10 [1.07KiB/s] [                <=>                     ]

-L, オプションか --rate-limit オプションで指定できるバイト数の単位をメモしておく。

単位 意味
K キビバイト (KiB)
M メビバイト (MiB)
G ギビバイト (GiB)
T テビバイト (TiB)

-q, --quiet オプション: 出力を抑制する

-q オプションか --quiet オプションを指定すると pv コマンドがモニタリング結果を表示しなくなる。

-L, オプションか --rate-limit オプションでデータの通過速度を制限するときに組み合わせて使うことが多い気がする。

表示のカスタマイズ

pv コマンドはモニタリング結果の表示をオプションでいろいろカスタマイズできる。よく使うやつをメモしておく。

pv コマンドはデフォルトでは通過したデータサイズ、経過時間、データの通過速度、プログレスバーとコマンドの完了までの予想残り時間を表示する。 ちなみにこれは pv -pterb みたいに実行するときと同じ。

$ cat /dev/zero | pv -pterb > /dev/null
11.4GiB 0:00:04 [2.85GiB/s] [      <=>                               ]

pv -t みたいにするとパイプラインを起動してからの経過時間を表示する。

実行時間が長そうなパイプラインに仕込んでおくと経過時間をリアルタイムで表示するのが便利。

$ sleep 10m | pv -t
0:00:04