私はこのオプションをすでに検索しましたが、 カスタムパッチ を含むソリューションのみを見つけました。 --helpに表示されず、それ以上の情報が見つからないという事実は、おそらく回答が「いいえ」であることを示していますが、これを確認したいと思います。
rsyncを使用してファイル転送の合計進行状況を表示することは可能ですか?
これをrsyncで行う公式な方法があります(バージョン3.1.0プロトコルバージョン31、Ubuntu Trusty 14.04でテスト済み)。
#> ./rsync -a --info=progress2 /usr .
305,002,533 80% 65.69MB/s 0:00:01 xfr#1653, ir-chk=1593/3594)
私は/usr
フォルダ。ファイルシステム全体を転送するためにこの機能が必要だったため、/usr
は良い代表的なサンプルのようです。
--info=progress2
は、たとえ部分的な値であっても、ニース全体の割合を示します。実際、私の/usr
フォルダは6ギガ以上です:
#> du -sh /usr
6,6G /usr/
rsync
は、すべてをスキャンするのに長い時間を要しました。だから、私が見たパーセンテージはほぼ常に90%完了していましたが、それでも何かがコピーされているのを見るのは快適です:)
参照:
'pv'(Debianおよびubuntuではapt-get install pv
)を使用できます。転送されたデータの量はファイルのサイズとは相関せず、ソースと宛先の間の差分に基づいているため、転送されたファイルの数を監視することをお勧めします。また、ファイルをカウントすると、1つの大きなデルタと小さなデルタを持つ別のデルタについて同じ進行状況がカウントされます。つまり、どのような場合でも、ETAの見積もりはかなり離れている可能性があります。サイズベースのETAは、宛先が空の場合にのみ機能します。この場合、デルタ==ソースのサイズです。
一般的な考え方は、rsyncから「転送」されたファイルごとに1行を発行し、それらの行を「pv」でカウントすることです。
rsync -ai/source remote:/ dest | pv -les [ファイル数]>/dev/null
私は(いくつかの理由で)ファイルシステム全体をバックアップする傾向があります。この場合、(df
またはdu
よりもはるかに安いfind
を使用してファイルの数を取得できます。 rsyncが行った後、もう一度ソース階層をトラバースします)。 -xオプションは、rsyncが同じソースファイルシステムに留まるようにします(他の内部マウントには従いません)。
rsync -aix/source remote:/ dest | pv -les $(df -i/source | Perl -ane 'print $ F [2] if $ F [5] =〜m:^ /:')>/dev/null
/ source内のファイルを一般的な方法でカウントする場合は、find /source|wc -l
を使用します(再度警告:I/Oに時間がかかる可能性があります)。
以下は、rsyncバージョン3.0.0以降に適用されます。以下で説明するオプションは、2008年3月1日のそのリリースで導入されました。
-info = progress2とともに、-no-inc-recursiveオプション(または、より短い-no-irエイリアスも使用できます。 )増分再帰を無効にします。
これにより、転送が進むにつれてファイルが徐々に発見されるのではなく、最初にファイルリスト全体が作成されます。それは開始する前にすべてのファイルを知っているので、全体的な進捗状況のより良いレポートを提供します。これはファイルの数に適用されます-ファイルサイズに基づく進行状況は報告されません。
これにはトレードオフが伴います。事前にファイルリスト全体を作成すると、メモリコストが高くなり、実際の転送の開始が大幅に遅れる可能性があります。ご想像のとおり、ファイルの数が多いほど、遅延は長くなり、必要なメモリも多くなります。
以下は、rsyncマニュアルからの抜粋です(ソース- http://rsync.samba.org/ftp/rsync/rsync.html ):
-r、--recursive
これは、ディレクトリを再帰的にコピーするようにrsyncに指示します。 --dirs(-d)も参照してください。 rsync 3.0.0以降、使用される再帰アルゴリズムは、以前よりもはるかに少ないメモリを使用する増分スキャンになり、最初のいくつかのディレクトリのスキャンが完了した後で転送を開始します。このインクリメンタルスキャンは、再帰アルゴリズムにのみ影響し、非再帰的な転送は変更しません。また、転送の両端がバージョン3.0.0以上の場合にのみ可能です。
一部のオプションでは、rsyncが完全なファイルリストを認識する必要があるため、これらのオプションは増分再帰モードを無効にします。これらには、-delete-before、-delete-after、-Prune-empty-dirs、および--delay-updatesが含まれます。このため、接続の両端が3.0.0以上の場合、-deleteを指定したときのデフォルトの削除モードは--delete-duringになりました(この改善された削除モードを要求するには、-delまたは--delete-duringを使用します)明示的に)。 --delete-afterを使用するよりも良い選択である--delete-delayオプションも参照してください。
-no-inc-recursiveオプションまたはより短い-no-i-rエイリアスを使用して、増分再帰を無効にすることができます。
特定のバージョンの違いについては https://rsync.samba.org も参照してください(スクロールしてリリースニュースのリンクを確認してください)。
ダナキムは正しいです。合計進捗インジケータを追加する簡単な方法はありません。
これは、rsyncが同期するファイルのリストを見るときに、どのファイルを変更する必要があるかが事前にわからないためです。デルタ転送を行う場合は、デルタ自体を事前に計算して、実行する必要がある作業の全体像を把握する必要があります。
つまり、実行する必要がある作業量を計算する最も簡単な方法は、実際に実行することです。
転送時間が長い場合は、du -s
両側に。でもwatch -n1 du -s
、本当に気になる場合。
watch
コマンドを実行します(du -s
ここに)定期的に(ここでは1秒ごとに)、出力フルスクリーンを表示します。
基本的にはありません。 --progressフラグを使用してファイルごとに進行状況を表示することしかできませんが、それはそれだけです。
私はあなたがそれの周りにラッパーを書くか、あなたがすでに見つけたパッチのどれかを使うことができると思います、しかしそれが本当に価値があるかどうかあなた自身に尋ねなければなりません、あなたは実際にrsyncのための完全な進歩が必要ですか?
私はzerodeuxからの回答を使用して、独自の小さなbashスクリプトを作成しました。
#!/bin/bash
RSYNC="ionice -c3 rsync"
# don't use --progress
RSYNC_ARGS="-vrltD --delete --stats --human-readable"
SOURCES="/dir1 /dir2 /file3"
TARGET="storage::storage"
echo "Executing dry-run to see how many files must be transferred..."
TODO=$(${RSYNC} --dry-run ${RSYNC_ARGS} ${SOURCES} ${TARGET}|grep "^Number of files transferred"|awk '{print $5}')
${RSYNC} ${RSYNC_ARGS} ${SOURCES} ${TARGET} | pv -l -e -p -s "$TODO"
私はまた、rsyncで全体の進行状況を表示する方法を検索し、この投稿から有用なanswserを見つけました: https://stackoverflow.com/questions/7157973/monitoring-rsync-progress
基本的に、rsync3.1.0の開発バージョンでは-info = progress2を使用できます。 doc の発言は次のとおりです。
個々のファイルではなく、転送全体に基づいて統計情報を出力する--info = progress2オプションもあります。ファイル名を出力せずにこのフラグを使用します(たとえば、多くの名前で画面をスクロールせずに転送がどのように行われているかを確認したい場合は、-vを指定しないか、-info = name0を指定します(-を指定する必要はありません--info = progress2を使用するための進捗オプション。)
最新のrsyncがなく(たとえば、OS Xには2.6.9がある)、--info=progress2
を使用できない場合は、進行中のスクロールするテキストのページから自分を救う別の方法があります。
rsync -aPh <source> <destination> | xargs -L1 printf "\33[2K\rTransferring: %s"
これにより、転送されている最新のファイルの名前が1行に出力されます。
Transferring: the-latest.file
私はzerodeuxからの回答を使用して、独自の小さなBASHスクリプトを記述しました。
#!/bin/bash
RSYNC="ionice -c3 rsync"
# don't use --progress
RSYNC_ARGS="-vrltD --delete --stats --human-readable"
SOURCES="/dir1 /dir2 /file3"
TARGET="storage::storage"
#echo "Executing dry-run to see how many files must be transferred..."
TODO=$(find ${SOURCES} | wc -l)
${RSYNC} ${RSYNC_ARGS} ${SOURCES} ${TARGET} | pv -l -e -p -s "$TODO"
TODOドライランを
TODO=$(find ${SOURCES} | wc -l)
それはファイルの数を非常に速く見つけます!
私はこれをコメントにしますが、十分な評判はありません。選択した回答に対するnaught101のコメントに応じて、-progressオプションは、転送する合計量のうち、転送されたファイルの数を示します。この投稿を見て、出力をより注意深く見るまで、私はこれに気づきませんでした。
'to-check'ステータスは、合計のうちいくつのファイルが残っているかを示します。これは、新しい宛先にrsyncするときに最も役立ち、すべてのファイルが完全にコピーされることがわかります。
Manページから:
When [each] file transfer finishes, rsync replaces the
progress line with a summary line that looks like this:
1238099 100% 146.38kB/s 0:00:08 (xfer#5, to-check=169/396)
In this example, the file was 1238099 bytes long in
total, the average rate of transfer for the whole file
was 146.38 kilobytes per second over the 8 seconds that
it took to complete, it was the 5th transfer of a regu-
lar file during the current rsync session, and there
are 169 more files for the receiver to check (to see if
they are up-to-date or not) remaining out of the 396
total files in the file-list.
使用する
lsof -ad3-999 -c rsync
Rsyncが現在開いているファイル(ファイルサイズが表示されます)を確認するには、rsyncをローカルの隠しファイルにコピーします
これは、-info = progress2でも完全に信頼できるわけではないことに注意してください。これはパーセンテージが、進行状況が表示されているときにrsyncが「知っている」ファイルの数に基づいているためです。これは、同期が必要なファイルの総数とは限りません(たとえば、深くネストされたディレクトリで大きなファイルが多数検出された場合)。 --info = progress2が進行状況の表示で「ジャンプバック」しないようにする1つの方法は、同期を開始する前にrsyncにすべてのディレクトリを再帰的にスキャンさせることです(増分再帰スキャンのデフォルトの動作ではなく)。 --no-inc-recursiveオプションも提供します。ただし、このオプションを使用すると、rsyncのメモリ使用量とランタイムも増加することに注意してください。
/ proc // ioからrsyncプロセス(またはそのほかのプロセス)の情報を抽出するスクリプトを使用して、転送される合計量が進行状況を計算していることを確認します。
#!/bin/bash
usage()
{
echo "usage: $0 PID BASEMSIZE [DELAY[s|m|h]]"
}
if [ $# -lt 2 ]; then
usage
exit 1
Elif [ $# -eq 3 ]; then
DELAY=$3
else
DELAY=5s
fi
PID=$1
PBASE=`echo "scale=2; $2/1024"|bc`
R_PID=$PID
W_PID=$PID
R_SPEED_MAX=0
W_SPEED_MAX=0
R_SPEED_CUM=0
W_SPEED_CUM=0
R_SPEED_AVG=0
W_SPEED_AVG=0
ETA=0
ETA_H=0
ETA_M=0
ETA_S=0
while [ ! -r /proc/$PID/io ];
do
clear
echo "Waiting for process with PID=$PID to appear!"
sleep 1
done
B_READ_PREV=`cat /proc/$R_PID/io|awk '$1 ~ /^read_bytes/ {print $2}'`
B_WRITE_PREV=`cat /proc/$W_PID/io|awk '$1 ~ /^write_bytes/ {print $2}'`
T1=`date +%s.%N`
count=0
while true
do
[ ! -r /proc/$PID/io ] && break
clear
B_READ=`cat /proc/$R_PID/io|awk '$1 ~ /^read_bytes/ {print $2}'`
B_WRITE=`cat /proc/$W_PID/io|awk '$1 ~ /^write_bytes/ {print $2}'`
BL_READ=`echo "scale=2; ($B_READ-$B_READ_PREV)/1048576"|bc`
BL_WRITE=`echo "scale=2; ($B_WRITE-$B_WRITE_PREV)/1048576"|bc`
GB_DONE=`echo "scale=2; $B_WRITE/1073741824"|bc`
PDONE=`echo "scale=2; $GB_DONE*100/$PBASE"|bc`
T2=`date +%s.%N`
TLOOP=`echo "scale=2; ($T2-$T1)/1"|bc`
R_SPEED=`echo "scale=2; $BL_READ/$TLOOP"|bc`
W_SPEED=`echo "scale=2; $BL_WRITE/$TLOOP"|bc`
if [ $count -ge 1 ]; then
R_SPEED_CUM=`echo "scale=2; $R_SPEED_CUM+$R_SPEED"|bc`
R_SPEED_AVG=`echo "scale=2; $R_SPEED_CUM/$count"|bc`
W_SPEED_CUM=`echo "scale=2; $W_SPEED_CUM+$W_SPEED"|bc`
W_SPEED_AVG=`echo "scale=2; $W_SPEED_CUM/$count"|bc`
[ `echo "scale=2; $W_SPEED > $W_SPEED_MAX"|bc` -eq 1 ] && W_SPEED_MAX=$W_SPEED
[ `echo "scale=2; $R_SPEED > $R_SPEED_MAX"|bc` -eq 1 ] && R_SPEED_MAX=$R_SPEED
fi
if [ `echo "scale=2; $W_SPEED_AVG > 0"|bc` -eq 1 ]; then
ETA=`echo "scale=2; (($PBASE-$GB_DONE)*1024)/$W_SPEED_AVG"|bc`
ETA_H=`echo "scale=0; $ETA/3600"|bc`
ETA_M=`echo "scale=0; ($ETA%3600)/60"|bc`
ETA_S=`echo "scale=0; ($ETA%3600)%60"|bc`
fi
echo "Monitoring PID: $PID"
echo
echo "Read: $BL_READ MiB in $TLOOP s"
echo "Write: $BL_WRITE MiB in $TLOOP s"
echo
echo "Read Rate: $R_SPEED MiB/s ( Avg: $R_SPEED_AVG, Max: $R_SPEED_MAX )"
echo "Write Rate: $W_SPEED MiB/s ( Avg: $W_SPEED_AVG, Max: $W_SPEED_MAX )"
echo
echo "Done: $GB_DONE GiB / $PBASE GiB ($PDONE %)"
[ `echo "scale=2; $ETA > 0"|bc` -eq 1 ] && printf "ETA: %02d:%02d:%05.2f (%.2fs)\n" $ETA_H $ETA_M $ETA_S $ETA
echo "Elapsed: `ps -p $PID -o etime=`"
T1=`date +%s.%N`
sleep $DELAY
B_READ_PREV=$B_READ
B_WRITE_PREV=$B_WRITE
((count++))
done
echo "----- Finished -------------------------------------------------------------------"
お使いのバージョンのrsync
が--info=progress2
オプションを受け入れない場合は、 tqdm
を使用できます。
インストールするには:
pip install tqdm
使用するには:
$ rsync -av/source/dest | tqdm --unit_scale | wc -l 10.0Mit [00:02、3.58Mit/s]
おそらく、pv
をrsyncと組み合わせることができます。特に、パラメータ_--size
_が役立ちます。ドキュメントを見ると、pv --size $(du -sb . | awk '{print $1}') | rsync -av . Host:/your/path
のようなものが機能するはずです。
ここ ドキュメントとソフトウェアが見つかります。
自分でこれを試したことはありません。
ここでは少し遅れるかもしれませんが、将来の回答を求める人にはメリットがあるかもしれません。
これも私を悩ませていたので、私は落ち込んで汚くなって、最初のスクリプトを書くと思った。パッケージzenityはインストールする必要があります(Sudo apt-get install zenity)が、おそらくすでにそこにあるはずです。また、完了時に進捗ダイアログのタイトルを変更するためにwmctrl(ウィンドウマネージャーコントロール)を使用します。これは簡単にインストールできますが、そうしなくても違いはありません。私のパネルでいつ完了するかを確認したいだけです。
このスクリプトは基本的に、ソースおよび宛先ディレクトリを要求し、duを使用してソースに対する宛先のサイズの割合を計算し、進行状況バーを表示します。
注:これは完全なディレクトリ/ファイル同期でのみ機能します(通常、これを使用してaptキャッシュのバックアップを作成します)。そのため、-exclude =/file/in/Source-directoryオプションはありません。また、ソースディレクトリではなく宛先ディレクトリにファイル/ディレクトリがある場合も機能しません。それをテストしたり、テストしたりする必要がなかったので、リモートのソース/宛先で機能するかどうかはわかりません。
PS。このスクリプトは非常に不適切に記述されているか、非常に非効率的です(ここではscript-virgin)。ただし、少なくともスクリプトの目的には役立ちます。もちろん、ニーズに合わせて編集して改善することもできます。 PSS。また、rsyncを強制終了するためのキャンセルボタンを取得できなかったため、削除しました。
#!/bin/bash
set -e;
WELC="Running RsyncP as $USER";
function echo_progress()
{
while (($TRANSFER_SIZE > 1000));
do
DEST_SIZE=$(du -s $DEST_FOLDER | cut -d / -f 1);
((TRANSFER_SIZE=$SOURCE_SIZE-DEST_SIZE));
PROGRESS_PERC=$((DEST_SIZE*100/SOURCE_SIZE));
echo $PROGRESS_PERC;
sleep 0.1s;
done;
echo 100;
zenity --info --width=250 --title=RsyncP --text="File syncing complete!";
}
function get_input()
{
dirs=$(zenity --forms --width=500 --title="RsyncP" --text="Enter source And destination directories" --add-entry="Source: " --add-entry="Destination: " --separator=" ");
SOURCE_FOLDER=$(echo $dirs | cut -d' ' -f 1);
DEST_FOLDER=$(echo $dirs | cut -d' ' -f 2);
OPTIONS=-$(zenity --list --title="RsyncP Options" --text="Select rsync options" --separator='' --height=470 --width=470 --checklist --column "activate" --column "Option" --column "Description" FALSE v "Verbose (Terminal only)" FALSE q "Quiet, supress non-error messages (Terminal only)" FALSE P "Progress (Terminal only)" FALSE a "Archive (lrpog)" TRUE r "Recurse into directories" FALSE p "Preserve permissions" FALSE o "Preserve owner" FALSE g "Preserve group" FALSE l "Copy symlinks as symlinks");
zenity --question --no-wrap --title="RsyncP" --width=500 --text="rsync $OPTIONS $SOURCE_FOLDER $DEST_FOLDER\nDo you want to continue?";
SOURCE_SIZE=$(du -s $SOURCE_FOLDER | cut -d / -f 1);
DEST_SIZE=$(du -s $DEST_FOLDER | cut -d / -f 1);
PROGRESS_PERC=$((DEST_SIZE*100/SOURCE_SIZE));
TRANSFER_SIZE=1001;
}
if [ "$(id -u)" != "0" ]; then
zenity --question --title=RsyncP --text="$WELC, Continue?";
get_input;
rsync $OPTIONS $SOURCE_FOLDER $DEST_FOLDER &
echo_progress | zenity --progress --title=RsyncP --no-cancel --auto-close --text="Copying from \n$SOURCE_FOLDER to \n$DEST_FOLDER" ;
else
zenity --question --title=RsyncP --text="$WELC, Continue?";
get_input;
Sudo rsync $OPTIONS $SOURCE_FOLDER $DEST_FOLDER &
echo_progress | zenity --progress --title=RsyncP --no-cancel --auto-close --text="Copying from \n$SOURCE_FOLDER to \n$DEST_FOLDER" ;
fi