Shell脚本

Shell脚本

不使用和使用的进度和预计写作时间sync

我发现没有工具(或简单的方法)可以在显示进度时刷新缓冲区并估计整个写入过程的估计时间 ETA(估计到达时间)。

  • pv可以显示操作系统所看到的进度时间,但如果目标驱动器速度较慢并且有大量 RAM,则它仅显示数据写入缓冲区之前的时间。在刷新缓冲区之前,该时间可能只是实际时间的一小部分。

  • dd编写有关所用数据量、时间和传输速率的最终报告。它还可以用来编写“进度”报告。它曾经给出比 更好的估计pv,但现在 USB 驱动器和存储卡仍然非常慢,而其他进程很快并且可用的缓冲区内存很大。因此dd也将在缓冲区被刷新之前完成。

  • 我可以对写入过程进行“计时”,包括sync使用time命令

    time ( write command; sync )
    

    它会给我实际使用的时间,这很有用,但只有在它完成之后。它不显示进度,也不估计总剩余时间。

  • 我可以运行iotop来显示读取和写入进程以及读取和写入的速度,但它不会估计剩余时间。

如何显示进度和预计时间所有的写过程?

如何显示整个写入过程的进度和预计时间、ETA(预计到达时间),包括使用 刷新缓冲区sync

相关问题的链接

答案1

Shell脚本

感谢@LinuxSecurityFreak 对于使用 中报告的“脏”数据量的建议/proc/meminfo

我制作了以下 shellscript flusher。它显示刷新缓冲区的进度和估计时间。例如,可以在从 iso 文件克隆到 USB 驱动器或存储卡后使用它,以便创建带有 Linux 操作系统的实时驱动器。

#!/bin/bash

timeorig=$(date '+%s')
deltat=5  # checking time interval

dirtorig=$(grep -e 'Dirty:' /proc/meminfo | tr -s ' ' '\t' | cut -f2)
dirt0=$dirtorig
echo -n "dirty = $dirt0 kB - before sync"

sync & spid=$!

while ps -A|grep "$spid" > /dev/null
do
 sleep "$deltat"
 dirty=$(grep -e 'Dirty:' /proc/meminfo | tr -s ' ' '\t' | cut -f2)
 deltad=$((dirt0-dirty))
 if [ $deltad -gt 0 ]
 then
  eta="$((dirty*deltat/deltad)) s"
  rate="$(((deltad+500)/deltat/1000)) MB/s"
 else
  eta="n.a."
  rate="n.a."
 fi
 echo -en "\0033[2K\0033[1G"
 echo -n "dirty = $dirty kB -- syncing -- rate = $rate -- eta = $eta"
 dirt0="$dirty"
done
echo -e "\0033[2K\0033[1GDone syncing :-)"

timefinal=$(date '+%s')
timeused=$((timefinal-timeorig))
if [ $timeused -gt 0 ]
then
 rate="$(((10*dirtorig+5)/timeused/10))"
 if [ $rate -ge 10000 ]
 then
  rate="$(((dirtorig+500)/timeused/1000)) MB/s"
 else
  rate="$rate kB/S"
 fi
else
 rate="n.a."
fi
echo "syncing time = $timeused s -- rate = $rate"

演示示例

克隆到慢速驱动器 (USB 2)

$ sudo dd if=xubuntu-18.04.1-desktop-amd64.iso of=/dev/sde bs=1M ; ./flusher
[sudo] password for sudodus: 
1367+1 posts in
1367+1 posts ut
1434386432 bytes (1.4 GB, 1.3 GiB) copied, 0.408724 s, 3.5 GB/s

输出来自flusher

dirty = 840600 kB -- syncing -- rate = 5 MB/s -- eta = 156 s
...
Done syncing :-)
syncing time = 302 s -- rate = 4639 kB/S

克隆到快速驱动器 (eSATA)

$ sudo dd if=xubuntu-18.04.1-desktop-amd64.iso of=/dev/sda bs=1M ; ./flusher
1367+1 posts in
1367+1 posts ut
1434386432 bytes (1.4 GB, 1.3 GiB) copied, 0.404442 s, 3.5 GB/s

输出来自flusher

dirty = 727508 kB -- syncing -- rate = 59 MB/s -- eta = 12 s
...
Done syncing :-)
syncing time = 25 s -- rate = 56 MB/s

编辑:

当前版本中有一个flusher名为的更新版本watch-flush姆库斯布。它可以通过以下别名与自己的窗口分开使用,

alias wf='xterm -title "watch-flush" -fa default -fs 13 -fg yellow -bg "#504030" -geometry 70x7 -e bash -c "watch-flush;read -n1" 2> /dev/null'

相关内容