当在具有大量文件和多个级别的目录的目录上运行时rsync
,我们可以估计完成的工作量或时间吗?
进度选项仅显示传输单个文件的进度,而不显示源目录下所有文件和目录的传输进度。
我猜想的一种方法是查看到目前为止它已传输的目录,并将其与源进行比较。
rsync
如果我知道传输文件和目录的顺序,将会有很大帮助。我猜这可能与那
rsync
多个线程每个线程做什么?我不确定它选择什么顺序,而且我之前对面包优先顺序的猜测似乎不正确(所以我把它划掉了)。
答案1
rsync -arv /source desc --info=progress2
给出 rsync 完成作业之前的预计时间
2,863,290,944 64% 5.71MB/s 0:04:12
0:04:12 是剩余时间
在 CentOS 7/8 上测试
答案2
您可以rsync
使用每个文件打印一行-i
,然后使用pv -l
根据行数(实际上是文件数)报告进度。
你会需要pv
(管道查看器):http://www.ivarch.com/programs/pv.shtml
rsync -ai sourcedir/ targetdir/ | pv -l -s filecount > logfile
使用以下命令获取文件计数:
find sourcedir | wc -l
注意:此命令将根据复制的文件数量显示进度信息。如果有许多小文件,此方法效果最佳。如果只有几个很大的文件,那么你不会有太多乐趣。
要在更新(或比较)现有副本时查看进度:
(更多信息:比较目录但不比较文件内容)
rsync -aii --delete sourcedir/ targetdir/ | pv -l -s filecount > logfile
第二个-i
使 rsync 为每个文件打印一行,即使它们相等。
添加-n
进行比较(实际上不是复制或删除任何内容)。
--delete
根据需要省略。
此命令将实时将不同的文件打印到屏幕上:
rsync -aii --delete sourcedir/ targetdir/ | pv -l -s filecount |
tee logfile | grep -v "^\."
当存在许多小文件时,上述命令效果最佳。如果您的大文件很少,这里有一些解决方法
Rsync 有一个内置的进度报告。请参阅 rsync 手册页中的-P
or--progress
或--info=progress2
。我还没有测试过这些。此外,这些选项也不能很好地与pv
.或者至少我还没有找到如何做到的。
这是另一个粗略的解决方法,可以根据大小查看进度:
- 在使用 复制之前记下目标分区的可用空间
df -h
。 - 使用 记下源目录的大小
du -sh
。 - 在目标上使用
watch df -h
并观察尺寸的增长。
显然,这仅在复制时有效,在更新或比较时无效。
答案3
所以我知道这已经很旧了,但我使用的方法(对我来说)比监视文件计数要好得多。下面是一个根据文件大小进行监控的脚本。
在目标服务器上,您可以像这样运行它:
# rsync-monitor.sh <folder> <expected final size of folder> <seconds between measuring start/stop size>
rsync-monitor /folder 516835 300
这将监控/folder
预计它达到 516835MB,并且每 300 秒它会打印出如下内容:
[Sun 21 Mar 2021 03:53:25 PM UTC] Starting | Sleeping 300s...
[Sun 21 Mar 2021 03:58:25 PM UTC] 11900MB of 516835MB | ~13MB/s | 10h 15m 0s remaining | Sleeping 300s...
[Sun 21 Mar 2021 04:03:27 PM UTC] 16497MB of 516835MB | ~15MB/s | 9h 0m 0s remaining | Sleeping 300s...
[Sun 21 Mar 2021 04:08:29 PM UTC] 20974MB of 516835MB | ~14MB/s | 9h 10m 0s remaining | Sleeping 300s...
[Sun 21 Mar 2021 04:13:31 PM UTC] 25600MB of 516835MB | ~15MB/s | 8h 50m 0s remaining | Sleeping 300s...
这是脚本:
#!/usr/bin/env bash
# The folder
FOLDER=$1
# The expected size of folder
MEGS=$2
# How many seconds to refresh
SLEEP=$3
SECONDSLEFT=1
START=$(du -sm $FOLDER |awk '{print $1}')
echo -e "[$(date)] Starting\t\t| Sleeping ${SLEEP}s..."
while (( $SECONDSLEFT > 0 )); do
sleep $SLEEP
END=$(du -sm $FOLDER |awk '{print $1}')
DOWNLOADED=$(( $END-$START ))
MEGSPERSECOND=$(( $DOWNLOADED/$SLEEP ))
SECONDSLEFT=$(( ($MEGS-$END)/$DOWNLOADED*$SLEEP ))
HOURS=$(( $SECONDSLEFT/60/60 ))
MINUTES=$(( ($SECONDSLEFT-$HOURS*60*60)/60 ))
SECONDS=$(( $SECONDSLEFT-$HOURS*60*60-$MINUTES*60 ))
echo -e "[$(date)] ${END}MB of ${MEGS}MB\t| ~${MEGSPERSECOND}MB/s\t| ${HOURS}h ${MINUTES}m ${SECONDS}s remaining\t| Sleeping ${SLEEP}s..."
START=$END
done
echo -e "[$(date)] Finished"
答案4
当你想知道估计时间时,你可以使用 $ time rsync * /temp 。在进行 rsync 之前,你应该检查文件的总大小。当您通过网络进行 rsync 时,rsync 的快慢取决于您的网络。你可以使用 $ ls -ltr 来检查哪些目录已经备份过。