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'

相關內容