情况:
我想将目录递归复制到外部硬盘驱动器。该目录包含大量文件(至少100,000个)。
问题:
当像我的任务一样频繁使用时(使用几个小时),外部硬盘驱动器往往会变得很热。这对预期寿命不利。因此,由于时间对我来说不是问题,我希望复制过程在复制文件之间休息一下,以使驱动器稍微冷却一下。
目前我使用ionice -c3 nice nice cp -r
它至少减少了所有其他正在运行的任务的性能损失。但它并没有解决散热问题。
有什么建议么?
使用其他命令也cp
可以rsync
(如果适用于命令行),但到目前为止我找不到任何命令或选项允许我在每个文件副本之间等待 x 秒。
附加信息: 外部硬盘驱动器是数据的最终目的地,而不是将数据传输到另一台计算机的方式。
答案1
不是特别优雅,但您可以运行复制命令,然后运行一个循环来暂停它,例如每 20 分钟暂停 3 分钟:
在后台启动复制命令
cp -r /path/to/dir /path/to/external/drive &
运行此循环将停止/重新启动它:
while ps -p $! >/dev/null; do kill -SIGCONT $!; sleep 20m; kill -s SIGSTOP $!; sleep 3m; done
答案2
rsync
有限制吞吐量的选项;例如
--bwlimit=1
1 KB/秒。使用后缀 KM 或 G 来乘以数字,默认值为 K。手册页讨论了套接字,但它也适用于本地副本。
你可以尝试sudo smartctl -a /dev/sdx
在你的sd盘上运行X看看是否有任何迹象表明它遭受过热的影响,尽管并非所有磁盘和总线都实现 SMART。
您可以尝试hdparm -M 128
(检查您的手册页以了解此命令的版本)在您的磁盘上执行以下操作声学管理这应该减慢头部运动以减少噪音和热量。
答案3
我想到了一个办法。不幸的是,它不会恢复,因此它假设您不介意让计算机保持打开状态。也没有测试过。
编辑:哎呀,terdon 的修改后的答案好多了。
SRC=src # source directory
DEST=dest # target directory
LOCKFILE=/var/tmp/copy.lock
BATCH_LEN=5m # 5 minutes
BATCH_DELAY=5m
touch "$LOCKFILE"
(cd "$SRC" && tar -cf - .) |
(cd "$TMP" && while [ -e "$LOCKFILE" ]; do
dd bs=4K & (sleep $BATCH_LEN; kill %1 >/dev/null)
sleep $BATCH_DELAY
done) |
(cd "$DEST" && tar -xpf - ; rm "$LOCKFILE")