こんにちは、エンジニアの坂口です。
エンジニアの皆さんみんな大好き黒い画面、ターミナル。
GUIもいいけど、コマンドでカタカタ…とデータベースのバックアップやリストアとかすることありますよね(Y/y)
シェルコマンドを実行するときに処理時間の長いコマンドだと、いつ終わるかわからなかったり。
どれだけの時間がかかったのかとか、知りたい場合がありますよねー。あるよね?
そんなときにひと工夫をしてみましょう!
timeコマンドを使って処理時間などをわかるようにする
timeコマンドはコマンド・プログラムを引数としてとり、引数として指定したコマンド・プログラムが実行されるのにどれだけ時間がかかった出力するコマンドです。
具体的な例として sleepコマンドとかで試してみましょう。
zshの場合
% time sleep 10
sleep 10 0.01s user 0.01s system 0% cpu 10.630 total
と、こんな感じにかかった時間などが出力されます。
bashの場合
$ time sleep 10
real 0m10.255s
user 0m0.007s
sys 0m0.011s
主な表示項目
- real: プログラムが開始してから終了するまでに実際に経過した時間
- user: プログラムの実行のためにCPUが使用した時間(ユーザCPU時間)
- sys: プログラムの実行をサポートするためにシステムが消費した時間(システムCPU時間)
とのことです。
データ量の多いデータベースのバックアップやリストアなど、時間のかかる処理の時に使うと便利かもしれませんね。
例(全部のデータベースをまとめてバックアップするのでかなり時間がかかる時)
% time mysqldump -uusername -ppassword --all-databases | gzip > dbname-`date "+%Y%m%d_%H%M%S"`.sql.gz
mysqldump -uroot -proot --all-databases 18.11s user 1.90s system 24% cpu 1:20.41 total
gzip > ~/Downloads/dbname-`date "+%Y%m%d_%H%M%S"`.sql.gz 46.51s user 0.56s system 58% cpu 1:20.41 total
みたいな。
最近のMacのデフォルトシェルのzshの場合はフォーマットが色々変えられるみたいですよ。興味のある方は試してみよう!
pvコマンドを使って処理の進捗状況をわかるようにする
かかった時間だけじゃなくて、処理が何処まで進んでいるか見れたらもっとわかりやすいのに…。
コマンドによってはオプション指定するとプログレスバー(何%まで進んだとかわかるやつ)が出たりしますが、無いものも多いです。
そんなときはこちらのpvコマンドを使ってみましょう。
https://www.ivarch.com/programs/pv.shtml
※ 通常のサーバには入っていないので自分でインストールできる環境限定にはなります。
Mac等のbrewが入っている場合
brew install pv
Linuxサーバなどの場合
apt-get install pv
yum install pv
dnf install pv
などなど(くれぐれも自分で管理しているサーバやPCでのみ入れてくださいね。勝手に他人のところに入れちゃだめですよ)
使い方は簡単で|(パイプ)で区切って使います。(少し工夫が必要ですが)
例(巨大なバックアップファイルの解凍する時など)
% pv dbname.sql | gzip > dbname.sql.gz
714MiB 0:00:07 [65.4MiB/s] [==============> ] 17% ETA 0:00:32
timeコマンドの時と同じくmysqldumpでのバックアップ時も可能でしたが、出力されるファイルの予測を自分で-sオプションで指定する必要がありました。
% mysqldump -uroot -proot --all-databases | gzip | pv -s 600M > ~/Downloads/dbname-`date "+%Y%m%d_%H%M%S"`.sql.gz
mysqldump: [Warning] Using a password on the command line interface can be insecure.
70.9MiB 0:00:11 [6.51MiB/s] [=========> ] 11% ETA 0:00:59
表示形式もいくつか選べます。
shaded
% mysqldump -uroot -proot --all-databases | gzip | pv -u shaded -s 600M > ~/Downloads/dbname-`date "+%Y%m%d_%H%M%S"`.sql.gz
mysqldump: [Warning] Using a password on the command line interface can be insecure.
83.9MiB 0:00:13 [8.01MiB/s] [████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░] 13% ETA 0:01:24
block
% mysqldump -uroot -proot --all-databases | gzip | pv -u block -s 600M > ~/Downloads/dbname-`date "+%Y%m%d_%H%M%S"`.sql.gz
mysqldump: [Warning] Using a password on the command line interface can be insecure.
169MiB 0:00:20 [23.4MiB/s] [████████████████████████ ] 28% ETA 0:00:59
granular(blockとの違いがあんまりわからず)
% mysqldump -uroot -proot --all-databases | gzip | pv -u granular -s 600M > ~/Downloads/dbname-`date "+%Y%m%d_%H%M%S"`.sql.gz
mysqldump: [Warning] Using a password on the command line interface can be insecure.
189MiB 0:00:23 [9.48MiB/s] [███████████████████████████▊ ] 31% ETA 0:00:49
さいごに
後どれだけで終わるとか、かかった時間とかは調査の報告とかには便利かもですね。
こういう一工夫で長時間の処理も少しは見た目的にも楽しめるようになるのではないでしょうかー?(ならんってw)
※ ちなみに、途中の例ででてきた、MySQL何かのバックアップ・リストアの件については MySQL / PostgreSQL データベースをgzip形式でバックアップ・リストアする を参考にしてください。