rsyncの進捗状況をリアルタイムに確認したい

やまもとやま
2023-05-12
2023-05-12

便利だけど困ること

どうも、やまもとやまです。
rsyncって便利ですよね。
指定さえ間違えなければ差分もきちんと同期してくれます。
バックアップ用途で利用される方も多いんじゃないでしょうか。
さてそんなrsync、数千ファイルレベルなら気になりませんが、ファイル数が膨大な場合はさすがに詳細ログは出力しないのでは。
でもどれくらい転送が進んでいるのか、確認したいときってありませんか?

どうすれば確認できるだろう

ぱっと思いつくのは、rsync先のディレクトリツリーを実際に見てみること。
lsコマンドなんかでがりがり見ていきましょう。
・・・しかしまあ、当然ながらやってみると無謀だと気づくことでしょう。
(うまく探せる人はぜひコツを教えてください)

ではどうすれば、となりますが、意外にシンプルに解決できます。
rsyncは通常はディレクトリを名前順に再帰的に探索する(ような気がします経験上)ので、処理中のファイルが分かればおおよその進捗状況も判断できます。
という訳で、lsofコマンドでrsyncプロセスがオープンしているファイルを調べてみましょう。
psコマンドでプロセスIDを調べ、lsofのpオプションでプロセスを指定します。

# lsof -p 13152
COMMAND   PID USER   FD   TYPE             DEVICE  SIZE/OFF        NODE NAME
rsync   13152 root  cwd    DIR              253,0      4096 11354091169 /backups/sv.example.com
rsync   13152 root  rtd    DIR              253,0      4096          64 /
rsync   13152 root  txt    REG              253,0    495824       58280 /usr/bin/rsync
rsync   13152 root  mem    REG              253,0 106176928  8594296527 /usr/lib/locale/locale-archive
rsync   13152 root  mem    REG              253,0   2156592  2147704460 /usr/lib64/libc-2.17.so
rsync   13152 root  mem    REG              253,0     41456  2147494947 /usr/lib64/libpopt.so.0.0.0
rsync   13152 root  mem    REG              253,0     37064  2147495055 /usr/lib64/libacl.so.1.1.0
rsync   13152 root  mem    REG              253,0     19896  2147495044 /usr/lib64/libattr.so.1.1.0
rsync   13152 root  mem    REG              253,0    163312  2147490707 /usr/lib64/ld-2.17.so
rsync   13152 root  mem    REG              253,0     26970  4295014385 /usr/lib64/gconv/gconv-modules.cache
rsync   13152 root    0u  FIFO              253,0       0t0 13449026231 /tmp/test-control-pipe
rsync   13152 root    1w  FIFO                0,9       0t0    56098713 pipe
rsync   13152 root    2w  FIFO                0,9       0t0    56098713 pipe
rsync   13152 root    3r   REG              253,0      3456  9351657229 /backups/sv.example.com/var/www/vhosts/example.com/statistics/webstat/nav.html

今回の場合、rsyncのプロセスIDが13152でした。
これでだいたい処理状況が分かりますね!
ただし、タイミングによってはなかなかどのファイルを処理中か分からなかったりします。
そこでwatchコマンドを組み合わせてみます。

# watch -n 5 lsof -p 13152
Every 5.0s: lsof -p 13152                                                                 Thu Apr 20 11:35:04 2023

COMMAND   PID USER   FD   TYPE             DEVICE  SIZE/OFF        NODE NAME
rsync   13152 root  cwd    DIR              253,0      4096 11354091169 /backups/sv.example.com
rsync   13152 root  rtd    DIR              253,0      4096          64 /
(略)

この例では5秒ごとに実行した結果を自動でリフレッシュ表示してくれます。
他の作業をしながらでも進捗状況が随時確認できますね。
べんりー!

というわけで

基本的なコマンドの組み合わせだけで、いい感じに進捗状況の確認ができました。
組み合わせ次第で色々とできそうですね。
どうせならできることはお手軽に楽できると良いなと思います。
それではまた!