คุณติดตามความคืบหน้าของววได้อย่างไร?


654

ddน่าแปลกใจ มันช่วยให้คุณทำสำเนาฮาร์ดไดรฟ์ไปที่อื่นฮาร์ดไดรฟ์เป็นศูนย์อย่างสมบูรณ์ ฯลฯ แต่เมื่อคุณเรียกใช้ddคำสั่งคุณจะไม่สามารถบอกความคืบหน้าได้ มันอยู่ที่เคอร์เซอร์จนกว่าคำสั่งจะเสร็จสิ้นในที่สุด ดังนั้นหนึ่งมอนิเตอร์ dd คืบหน้าอย่างไร?

คำตอบ:


728

อัปเดต 2016 : หากคุณใช้ GNU coreutils> = 8.24 (ค่าเริ่มต้นใน Ubuntu Xenial 16.04 ขึ้นไป) ดูวิธีที่ 2 ด้านล่างเพื่อดูวิธีอื่นในการแสดงความคืบหน้า


วิธีที่ 1: โดยใช้ pv

ติดตั้งpvและวางไว้ระหว่างddคำสั่งอินพุต / เอาต์พุตเท่านั้น

หมายเหตุ : ddคุณไม่สามารถใช้มันเมื่อคุณเริ่มต้นแล้ว

จากคำอธิบายแพคเกจ :

pv- Pipe Viewer - เป็นเครื่องมือที่ใช้เทอร์มินัลสำหรับตรวจสอบความคืบหน้าของข้อมูลผ่านไปป์ไลน์ สามารถแทรกลงในไพพ์ไลน์ปกติใด ๆ ระหว่างสองกระบวนการเพื่อให้เห็นภาพว่าข้อมูลกำลังผ่านไปเร็วแค่ไหนใช้เวลานานเท่าไหร่ถึงจะเสร็จสมบูรณ์และประมาณระยะเวลาที่จะเสร็จสิ้น

การติดตั้ง

sudo apt-get install pv

ตัวอย่าง

dd if=/dev/urandom | pv | dd of=/dev/null

เอาท์พุต

1,74MB 0:00:09 [ 198kB/s] [      <=>                               ]

คุณสามารถระบุขนาดโดยประมาณด้วย--sizeถ้าคุณต้องการการประมาณเวลา


ตัวอย่างสมมติว่าดิสก์ 2GB ถูกคัดลอกมาจาก / dev / sdb

คำสั่งโดยไม่ต้องpvจะเป็น:

sudo dd if=/dev/sdb of=DriveCopy1.dd bs=4096

สั่งด้วยpv:

sudo dd if=/dev/sdb | pv -s 2G | dd of=DriveCopy1.dd bs=4096

เอาท์พุท:

440MB 0:00:38 [11.6MB/s] [======>                             ] 21% ETA 0:02:19

การใช้งานอื่น ๆ

แน่นอนคุณสามารถใช้pvโดยตรงเพื่อไพพ์เอาต์พุตไปยัง stdout:

pv /home/user/bigfile.iso | md5sum

เอาท์พุต

50,2MB 0:00:06 [8,66MB/s] [=======>         ] 49% ETA 0:00:06

โปรดทราบว่าในกรณีนี้pvจดจำขนาดโดยอัตโนมัติ


วิธีที่ 2: statusเพิ่มตัวเลือกใหม่ในdd(GNU Coreutils 8.24+)

ddใน GNU Coreutils 8.24+ (Ubuntu 16.04 และใหม่กว่า) มีstatusตัวเลือกใหม่เพื่อแสดงความคืบหน้า:

ตัวอย่าง

dd if=/dev/urandom of=/dev/null status=progress

เอาท์พุต

462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s

76
pv bigfile.iso | dd of = / dev / yourdevice
ไอออน Br

18
โปรดทราบว่าพารามิเตอร์สำหรับ "DD" มีความเหมาะสมในช่วงครึ่งแรก dd if=/dev/zero bs=1M count=35000 | pv | dd of=VirtualDisk.raw(ส่วนการป้อนข้อมูลของท่อ):
Sopalajo de Arrierez

6
pv bigfile.iso | dd of=VirtualDisk.raw bs=1M count=35000ทำงานได้รับการยืนยัน @SopalajodeArrierez สามารถกำหนดพารามิเตอร์ใน dd ตัวที่สอง
SiddharthaRT

11
ใช้pv < /dev/sda > /dev/sdbดูเหมือนว่าจะได้รับความเร็วที่ดีกว่า ( แหล่งที่มา )
นิโคลา Feltrin

14
FYI เกี่ยวกับความเร็ว การทดสอบในคอมพิวเตอร์ของฉันกับ Samsung 840 PRO SSD: dd if=/dev/urandom | pv | of=/dev/sdbให้การเขียน ~ 18MB / s, dd if=/dev/zero | pv | of=/dev/sdbให้ ~ 80MB / s, และธรรมดาธรรมดาdd if=/dev/zero of=/dev/sdbให้ ~ 550MB / s (ใกล้กับความเร็วการเขียนสูงสุดของ SSD) bs=4096000ทั้งหมดที่มี
Tedd Hansen

461

จากHowTo: ตรวจสอบความคืบหน้าของวว

คุณสามารถตรวจสอบความคืบหน้าของ dd โดยไม่ต้องหยุดโดยใช้killคำสั่ง

หากต้องการดูความคืบหน้าของการดำเนินการddทันทีให้เปิดเทอร์มินัลอื่นแล้วป้อน:

sudo kill -USR1 $(pgrep ^dd)

สิ่งนี้จะแสดงddความคืบหน้าในddหน้าต่างเทอร์มินัลโดยไม่หยุดกระบวนการ หากคุณอยู่ใน BSD หรือ OS X ใช้แทนINFO สัญญาณจะยุติ DDUSR1USR1

หากคุณต้องการได้รับการอัปเดตddความคืบหน้าเป็นประจำให้ป้อน:

watch -n5 'sudo kill -USR1 $(pgrep ^dd)'

watchจะสอบสวนddกระบวนการทุก ๆ -n วินาที ( -n5= 5 วินาที) และรายงานโดยไม่หยุด

บันทึกเครื่องหมายคำพูดเดี่ยวที่เหมาะสมในคำสั่งด้านบน


19
สิ่งนี้ใช้ได้ผล แต่มีความคิดเห็นอยู่บ้าง ก่อนอื่นฉันไม่แน่ใจว่าทำไมคุณถึงหนี backticks ของคุณ (ถ้าเป็นเพื่อแก้ไขดังนั้นคุณทำผิดพลาด) ประการที่สองฉันขอแนะนำให้ใช้ ^ dd $ ในกรณีที่มีสิ่งอื่นที่ทำงานด้วยคำนำหน้า dd สุดท้ายคุณไม่จำเป็นต้องใช้ sudo เพื่อส่งสัญญาณ USR1 มิฉะนั้นคำตอบที่ดีคือ +1
gsingh2011

22
NB! วิธีนี้จะขัดจังหวะการทำงานของ dd ภายใต้ OSX
Maxim Kholyavkin

26
@Speakus คุณต้องใช้kill -INFO $(pgrep ^dd$)กับระบบ BSD (เช่น OSX)
Torben

20
sudo pkill -usr1 ddจำได้ง่ายกว่าทำงานได้ดีอย่างสมบูรณ์ (อย่างน้อยใน Ubuntu 14.04) และพิมพ์น้อยกว่า
Phizes

21
ฉันชอบสิ่งนี้เพราะฉันกลัวว่าpvการถ่ายโอนจะช้าลงอย่างที่ TeddHansen แสดง นอกจากนี้ฉันจะเดิมพันคนจำนวนมากกำลัง Googling นี้เพราะพวกเขาแล้วเริ่มต้นddการดำเนินงาน)
sudo

104

ตัวอย่างเล็ก ๆ น้อย ๆ ที่มีประโยชน์ใช้กับpvและพิมพ์น้อยลงหรือความคืบหน้ามากขึ้นแล้วคำตอบอื่น ๆ :

ก่อนอื่นคุณจะต้องติดตั้งpvโดยใช้คำสั่ง:

sudo apt-get install pv

จากนั้นตัวอย่างบางส่วนคือ:

pv -n /dev/urandom | dd of=/dev/null
pv -tpreb source.iso | dd of=/dev/BLABLA bs=4096 conv=notrunc,noerror

หมายเหตุ: ตัวอย่างแรกคือ 5 dd if=/dev/urandom | pv | dd of=/dev/nullตัวอักษรพิมพ์น้อยลงแล้ว

และฉันชอบโคลนดิสก์ไดรฟ์ (แทนที่ X ด้วยตัวอักษรไดรฟ์):

(pv -n /dev/sdX | dd of=/dev/sdX bs=128M conv=notrunc,noerror) 2>&1 | dialog --gauge "Running dd command (cloning), please wait..." 10 70 0

ภาพหน้าจอ

แหล่งที่มา: http://www.cyberciti.biz/faq/linux-und-dd-command-show-progress-while-coping/

นอกจากนี้สำหรับการเก็บถาวรตัวเอง


3
คุณจะต้องติดตั้งdialogพร้อมกับคำสั่งด้วยapt-get install dialog
k7k0

7
รักdialogตัวอย่างเช่น เซเรนิตี้ตอนนี้ !
alex grey

คุณสามารถโทรหากล่องโต้ตอบนั้นด้วย python เท่านั้น
mikeymop

1
ขอบคุณคำตอบนี้ค้นพบdialogสิ่งนี้จะช่วยในการเขียนสคริปต์เชลล์อย่างไม่น่าเชื่อ: D
holms

2
brew install pv dialogสำหรับ Mac สุภาพบุรุษคนนี้ยังคำนวณด้วยสไตล์ ไชโย
evilSnobu

62

ใช้Ctrl+ Shift+ Tในขณะที่ddทำงานและมันจะออกความคืบหน้า (เป็นไบต์)

load: 1.51  cmd: dd 31215 uninterruptible 0.28u 3.67s
321121+0 records in
321120+0 records out
164413440 bytes transferred in 112.708791 secs (1458745 bytes/sec)

5
ใช้งานไม่ได้กับฉันบน Kubuntu Trusty เป็นไปได้ที่จะเชื่อมโยงคีย์ที่ขัดแย้งกันหรือไม่
jamadagni

14
ทางที่ดี. มันทำงานภายใต้ OSX แต่ไม่ทำงานภายใต้ Ubuntu 14.04
Maxim Kholyavkin

1
บรรทัดแรกถูกสร้างขึ้นโดย OS X เท่านั้นหลัง 3 ddสายจาก
Itay Grudev

3
คุณควรจะสามารถใช้ kill -INFO บน BSD เช่น OS X ได้
macshome

3
สิ่งนี้ใช้ไม่ได้กับ Ubuntu Ctrl-T / Ctrl-Shift-T เอาท์พุท^Tไปยังเครื่องเทอร์มินัลเท่านั้น (ยกเว้นแอปเทอร์มินัลจำนวนมากจะขัดขวาง Ctrl-Shift-T และเปิดแท็บใหม่) ผู้ค้นหาหลายคนใน OSX / BSD อาจชื่นชมคำตอบนี้ แต่ควรชัดเจนว่าไม่ใช่สำหรับ Ubuntu (หรือ GNU / LInux โดยทั่วไปใช่ไหม)
mwfearnley

60

เพื่อความสมบูรณ์:

coreutilsของGNUเวอร์ชั่น8.24มีแพตช์สำหรับ dd แนะนำพารามิเตอร์เพื่อพิมพ์ความคืบหน้า

การกระทำที่แนะนำการเปลี่ยนแปลงนี้มีความคิดเห็น:

dd: สถานะใหม่=ระดับความคืบหน้าในการพิมพ์สถิติเป็นระยะ

ดิสทริบิวชันมากมายรวมถึงUbuntu 16.04.2 LTSใช้เวอร์ชันนี้


แค่อยากจะเพิ่มวิธีการที่ฉันได้รวบรวม 8.24 coreutils: apt install build-essentialและapt-get build-dep coreutilsจากนั้นดาวน์โหลด coreutils-8.25.tar.xz, และเรียกใช้tar xvf coreutils-8.25.tar.xz configure --prefix=$HOME/usr/local makeรวบรวมใหม่ddจะอยู่ภายใต้srcผบ. คุณสามารถคัดลอกไปยัง / bin และแทนที่ที่มีอยู่หนึ่งหรือ jus ทำงานเป็น src / วัน
Holms

2
เย็น! ฉันชอบคุณสมบัตินี้ และใช้เวลาประมาณ 30 ปีในการสอน dd เพื่อพิมพ์ผลลัพธ์ความคืบหน้า :-)
Johannes Overmann

ค่อยยังชั่ว! ฉันจะเพิ่มอาร์กิวเมนต์นี้ทันทีใน dd shell alias
Stephan Henningsen

โปรดทราบว่าบางครั้งสถานะจะพิมพ์ด้วยตัวเลขสองตัวหนึ่งตัวในหน่วย SI และค่าที่เทียบเท่าในหน่วยไบนารี (เช่น 10 MB, 9.5 MiB)
palswim

33

ที่ดีที่สุดคือการใช้http://dcfldd.sourceforge.net/มันง่ายในการติดตั้งผ่าน apt-get


3
ขอบคุณสำหรับตัวชี้ไปยัง dcfldd เข้ากันได้กับ dd มาก แต่มีคุณสมบัติใหม่ที่ดี ฉันชอบความคืบหน้ามาตรฐานโดยเฉพาะอย่างยิ่ง
ฟลอยด์

4
เหตุใด dcfldd ไม่เป็นที่รู้จักมากขึ้นจึงเป็นปริศนาที่สมบูรณ์สำหรับฉัน
Freedom_Ben

28
อาจเป็นเพราะชื่อของมัน
Giovanni Toraldo

มันมีตัวเลือกddและตัวเลือกstatus=onโดยค่าเริ่มต้นสำหรับข้อความความคืบหน้าstatusinterval=N(N ในบล็อก) สำหรับความถี่การปรับปรุงข้อความและsizeprobe=[if|of]ตัวบ่งชี้ร้อยละ ฉันจะใช้นามแฝงเป็นDD:)
kavadias

25

สถานะความคืบหน้าดั้งเดิมถูกเพิ่มใน dd !!!

Coreutils เวอร์ชันใหม่ (8.24) เพิ่มสถานะความคืบหน้าในddเครื่องมือ:

การใช้งานบน Xubuntu 15.10:

เปิดเทอร์มินัลแล้วพิมพ์คำสั่งเหล่านี้:

wget ftp://ftp.gnu.org/pub/gnu/coreutils/coreutils-8.24.tar.xz
tar -xf coreutils-8.24.tar.xz
cd coreutils-8.24
./configure && make -j $(nproc)

เรียกใช้ddเป็นราก:

sudo su
cd src
./dd if=/dev/sdc of=/dev/sda conv=noerror status=progress

คุณจะเห็น: ไบต์วินาทีและความเร็ว (ไบต์ / วินาที)

วิธีตรวจสอบเวอร์ชั่นของdd:

พื้นเมือง:

dd --version

ใหม่:

cd coreutils-8.24/src
./dd --version

18

หากคุณเริ่ม dd แล้วและหากคุณกำลังเขียนไฟล์เช่นเมื่อสร้างสำเนาของ pendrive ไปยังดิสก์คุณสามารถใช้คำสั่ง watch เพื่อสังเกตขนาดของไฟล์เอาต์พุตเพื่อดูการเปลี่ยนแปลงและการประเมินโดยประมาณ

watch ls -l /pathtofile/filename

หากต้องการดูเฉพาะขนาดไฟล์ (มุมมอง h-human):

watch ls -sh /pathtofile/filename

ยังเป็นวิธีที่ทำงานได้ ...
ζ--

3
มีประโยชน์แม้ว่าจะไม่ได้ผลหากคุณกำลังไพพ์เอาต์พุต dd ไปยังไฟล์อื่นที่ไม่ใช่ไฟล์ (เช่น gzip'ing ก่อนที่จะเขียนลงดิสก์)
Ponkadoodle

ไม่ทำงานกับไฟล์พิเศษ
Johannes Overmann

13

dd | pv | ddสามทำสำเนา 50GB VM ของฉันใช้เวลา 800 วินาทีเมื่อเทียบกับ 260 วินาทีใช้ DD เพียง ด้วยไพพ์ไลน์นี้อย่างน้อย pv ไม่ทราบว่าไฟล์อินพุตมีขนาดใหญ่เพียงใดดังนั้นจึงไม่สามารถบอกคุณได้ว่าคุณอยู่ไกลแค่ไหนดังนั้นจึงไม่มีข้อเสียในการทำดังต่อไปนี้ - และคุณจะได้รับความเร็วที่ดี:

ฉันจะหลีกเลี่ยง pv ในสิ่งที่มีขนาดใหญ่และ (ถ้าใช้ Bash):

ควบคุม -Z กระบวนการ dd

bgเพื่อวางไว้ในพื้นหลัง สังเกตว่าbgจะให้ผลลัพธ์เหมือนกับ[1] 6011ที่หมายเลขหลังคือรหัสกระบวนการ ดังนั้นทำ:

while true; do kill -USR1 process_id ; sleep 5; done

โดยที่ process_id เป็นรหัสกระบวนการที่คุณสังเกตเห็น กด Control-C เมื่อคุณเห็นสิ่งที่ต้องการ:

[1]+  Done dd if=/path/file.qcow2 of=/dev/kvm/pxetest bs=4194304 conv=sparse
-bash: kill: (60111) - No such process

คุณทำเสร็จแล้ว

แก้ไข: ผู้ดูแลระบบ Silly! ทำให้ชีวิตของคุณเป็นอัตโนมัติไม่ทำงาน! ถ้าฉันมีกระบวนการที่ยาวนานที่ฉันต้องการตรวจสอบนี่เป็นหนึ่งในสายการบินที่จะดูแล Enchilada ทั้งหมดสำหรับคุณ ใส่ทั้งหมดนี้ไว้ในบรรทัดเดียว:

 dd if=/path/to/bigimage of=/path/to/newimage conv=sparse bs=262144 & bgid=$!; while true; do sleep 1; kill -USR1 $bgid || break; sleep 4; done

แน่นอนคุณสามารถสคริปต์มันอาจทำให้ $ 1 ไฟล์อินพุตของคุณและ $ 2 ไฟล์เอาต์พุตของคุณ นี่เป็นแบบฝึกหัดสำหรับผู้อ่าน โปรดทราบว่าคุณจำเป็นต้องนอนหลับน้อยก่อนที่จะฆ่าหรือการฆ่าอาจตายพยายามส่งสัญญาณไปยัง dd เมื่อยังไม่พร้อม ปรับการนอนหลับของคุณตามต้องการ (อาจลบการนอนหลับครั้งที่สองออกไปด้วยกัน)

Bash- FTW! :-)


1
บีบอัดwhileลูป watchใช้
muru

1
@muru มันขึ้นอยู่กับ ฉันไม่รู้เกี่ยวกับระบบของคุณ แต่ใน CentOS7 * ผลลัพธ์นั้นอ่านไม่ออก สามารถอ่านได้ แต่ดูไม่เป็นระเบียบ นอกจากนี้ยังหยุดยั้งการส่งออกก่อนหน้าของคุณเพื่อให้คุณเสียประวัติความเร็วของววของคุณ เหมืองแตกต่างกันระหว่าง 20 MB / s และ 300 MB / s มันน่าสนใจที่จะดูตัวเลขต่างกันและให้คำแนะนำด้วย ฉันคิดว่าความแปรปรวนขนาดใหญ่บางอย่างเกิดขึ้นเนื่องจากแอ่งน้ำขนาดเล็กของ LVM เพิ่มการจัดสรรสำหรับ LV ที่ฉันกำลังเขียนอยู่ * ใช่นี่คือฟอรัม Ubuntu แต่ฉันมาถึงที่นี่เพื่อค้นหา "dd monitor progress" มันเป็นผลลัพธ์แรกใน Google
Mike S

โอ้ฉันหมายใน terminal sudo watch pkill ddหรือหน้าจอหน้าต่างอื่นเรียก จากนั้นดูddผลลัพธ์ของสถิติอย่างสะดวกสบาย
muru

pkill จะไม่ส่ง SIGTERM เป็นค่าเริ่มต้นหรือไม่ ฉันไม่ต้องการที่จะทดลองเพราะ pgrep dd เกิดขึ้นกับ 3 pid เมื่อใช้ dd เดี่ยว: kthreadd, oddjob และ dd ฉันกลัวว่า pkill จะทำอะไร คุณสามารถส่งสัญญาณ -USR1 ด้วย pkill แต่อีกครั้งฉันไม่รู้ว่าปลอดภัยที่จะส่งไปยังเคอร์เนลเธรดหรือ obbjob คำสั่ง watch ดูสะอาดขึ้น แต่ดูเหมือนว่าจะมีหลายขั้นตอนเพิ่มเติมเพื่อหลีกเลี่ยงการวนซ้ำในขณะที่ โดยทั่วไปถ้าฉันทำ dd ในหน้าต่างเดียวฉันจะทำบางสิ่งทันทีหลังจากนั้นในเชลล์เดียวกัน ขณะที่ห่วงปลอดภัย: คุณรู้ว่า pid ได้รับสัญญาณใด
Mike S

ส่วนใหญ่ผมไม่สนใจที่ PIDs watch pkill -USR1 -x ddรับสัญญาณตั้งแต่ผมใช้ ตั้งแต่ฉันยังใช้watchสำหรับงานที่คล้ายกันอื่น ๆ อันนี้มาโดยธรรมชาติ
muru

11

http://linuxcommando.blogspot.com/2008/06/show-progress-during-dd-copy.html

โดยทั่วไป:

kill -USR1 < dd pid >

1
"pkill -USR1 dd" เป็นเวอร์ชั่นที่ง่ายที่สุดที่ฉันรับรู้ ในระบบของฉันฉันต้องการ sudo: "sudo pkill -USR1 dd" ทำงานได้หลังจากที่คุณพิมพ์คำสั่ง dd แล้วและคุณไม่จำเป็นต้องติดตั้งอะไรใหม่
Fred Hamilton

7

ที่ง่ายที่สุดคือ:

 dd if=... of=... bs=4M status=progress oflag=dsync

oflag=dsyncจะทำให้การเขียนของคุณตรงกันอยู่เสมอดังนั้นข้อมูลของstatus=progressมีความแม่นยำมากขึ้น อย่างไรก็ตามมันอาจช้าลงเล็กน้อย



ขอบคุณสำหรับสิ่งนี้! ฉันกำลังทำ dd กับรีโมต lvm2 และ bs = 4M เพิ่มการถ่ายโอนของฉันด้วยปัจจัย 20 และตัวบ่งชี้ความคืบหน้านั้นวิเศษมาก
Lonnie Best

6

บน Ubuntu 16.04

Ubuntu 16.04 มาพร้อมกับ DD (coreutils) เวอร์ชัน8.25 ดังนั้นตัวเลือกที่status=progress ถูก :-) สนับสนุน

หากต้องการใช้เพียงเพิ่มstatus=progressพร้อมกับddคำสั่งของคุณ

ตัวอย่าง:

dd bs=4M if=/media/severus/tools-soft/OperatingSystems/ubuntu-16.04-desktop-amd64.iso of=/dev/null status=progress && sync

ให้สถานะเป็น

1282846183 bytes (1.2 GiB, 1.1 GiB) copied, 14.03 s, 101.9 MB/s

ป้อนคำอธิบายรูปภาพที่นี่


5

ใช้ตัวเลือกstatus=progressเพื่อรับความคืบหน้าในระหว่างการถ่ายโอน

นอกจากนี้conv=fsyncจะแสดงข้อผิดพลาด I / O

ตัวอย่าง:

sudo dd if=mydistrib.iso of=/dev/sdb status=progress conv=fsync

4

ฉันชอบ ddrescue มันทำหน้าที่เหมือน dd แต่ให้ผลลัพธ์และไม่ล้มเหลวจากข้อผิดพลาดในทางตรงกันข้ามมันมีอัลกอริธึมขั้นสูงมากและพยายามอย่างหนักที่จะทำสำเนาที่ประสบความสำเร็จจริง ๆ ... นอกจากนี้ยังมี GUIs มากมายสำหรับมัน

โครงการ: https://www.gnu.org/software/ddrescue

Wikipedia: https://en.wikipedia.org/wiki/Ddrescue

ป้อนคำอธิบายรูปภาพที่นี่


3

ฉันได้สร้าง wrapper ทุบตีมากกว่าddที่จะใช้pvเพื่อแสดงความคืบหน้า ใส่ลงในของคุณ.bashrcและใช้ddตามปกติ:

# dd if=/dev/vvg0/root of=/dev/vvg1/root bs=4M
    2GB 0:00:17 [ 120MB/s] [===========================================================>] 100%            
0+16384 records in
0+16384 records out
2147483648 bytes (2.1 GB) copied, 18.3353 s, 117 MB/s

ที่มา:

dd()
{
    local dd=$(which dd); [ "$dd" ] || {
        echo "'dd' is not installed!" >&2
        return 1
    }

    local pv=$(which pv); [ "$pv" ] || {
        echo "'pv' is not installed!" >&2
        "$dd" "$@"
        return $?
    }

    local arg arg2 infile
    local -a args
    for arg in "$@"
    do
        arg2=${arg#if=}
        if [ "$arg2" != "$arg" ]
        then
            infile=$arg2
        else
            args[${#args[@]}]=$arg
        fi
    done

    "$pv" -tpreb "$infile" | "$dd" "${args[@]}"
}

วิธีที่ดี แต่มันไม่ทำงานกับคำสั่งเช่น sudo หรือเวลา
Maxim Kholyavkin

1
ใส่ลงใน / usr / local / bin / dd โดยใส่ไว้ด้านบน: #!/bin/bash. ด้านล่าง: tmp=":${PATH}:"; tmp=${tmp/:/usr/local/bin:/:}; tmp=${tmp%:}; PATH=${tmp#:}; dd "$@"หรือคุณอาจต้องการddระบุตำแหน่งฮาร์ดโค้ด local dd=/usr/bin/ddจากนั้นใช้ อย่าลืมเพิ่มบิตที่ใช้งานได้: chmod +x /usr/local/dd.
midenok

2

ดังนั้นวันนี้ฉันรู้สึกหงุดหงิดเล็กน้อยกับการพยายามวิ่งkillวนเป็นวงกลมในขณะที่ddกำลังวิ่งและเกิดขึ้นกับวิธีนี้ในการวิ่งขนานกันได้อย่างง่ายดาย:

function vdd {
    sudo dd "$@" &
    sudo sh -c "while pkill -10 ^dd$; do sleep 5; done"
}

ตอนนี้ใช้vddที่ใดก็ได้ตามปกติdd(ผ่านการขัดแย้งทั้งหมดโดยตรง) และคุณจะได้รับรายงานความคืบหน้าที่พิมพ์ทุก 5 วินาที

ข้อเสียเพียงอย่างเดียวคือคำสั่งจะไม่ส่งคืนทันทีเมื่อ dd เสร็จสมบูรณ์ ดังนั้นจึงเป็นไปได้ว่าคำสั่งนี้จะทำให้คุณรออีก 5 วินาทีหลังจากที่ dd กลับมาก่อนที่จะสังเกตเห็นและออก


2

สิ่งนี้บังคับให้ dd จัดทำสถิติทุก 2 วินาทีซึ่งเป็นค่าเริ่มต้นสำหรับการดู:

watch killall -USR1 dd

หากต้องการเปลี่ยนจากทุก 2 วินาทีเป็นทุกๆ 5 วินาทีให้เพิ่มตัวเลือก -n 5 ดังนี้:

watch -n 5 killall -USR1 dd

2

ในกรณีที่ใครก็ตามจาก CentOS land เกิดขึ้นเพื่อค้นหากระทู้นี้ ...

ตัวเลือก 'status = คืบหน้า' ใช้งานได้กับ CentOS 7.5 และ 7.6

คำตอบข้างต้นโดย @davidDavidson บอกเป็นนัยถึงฟีเจอร์ที่ถูกเพิ่มเข้ามาใหม่ใน Coreutils 8.24

coreutils ของ GNU เวอร์ชั่น 8.24 มีแพตช์สำหรับ dd แนะนำพารามิเตอร์เพื่อพิมพ์ความคืบหน้า

อาจเป็นกรณีนี้ แต่ CentOS อาจไม่ทำตามรูปแบบการกำหนดรุ่นเดียวกัน

Coreutils เวอร์ชันที่มาพร้อมกับ CentOS 7.6.1810 คือ:

coreutils-8.22-23.el7.x86_64 : A set of basic GNU tools commonly used in shell scripts

และเวอร์ชั่นของ dd ที่ติดตั้งคือ:

[root@hostname /]# dd --version
dd (coreutils) 8.22
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Paul Rubin, David MacKenzie, and Stuart Kemp.

นี้แสดงให้เห็นรุ่น8.22

อย่างไรก็ตามฉันได้ทดสอบ 'status = progress' ด้วย dd ทั้งบน CentOS 7.5 และ CentOS 7.6 (ทั้งคู่กับ Coreutils เวอร์ชัน 8.22) และทำงานได้อย่างถูกต้อง

ฉันไม่รู้ว่าทำไม RedHat เลือกที่จะใช้ Coreutils เวอร์ชันเก่า แต่มีการใช้งานกับ 8.22


1

อย่างน้อยกับ 'dd' จาก GNU coreutils หรือ busybox มันจะตอบสนองต่อสัญญาณ USR1 โดยการพิมพ์ข้อมูลความคืบหน้าไปยัง stderr

ฉันเขียนสคริปต์ตัวห่อหุ้มเล็กน้อยสำหรับ dd ที่แสดงตัวบ่งชี้เปอร์เซ็นต์ที่สมบูรณ์และพยายามที่จะไม่ยุ่งเกี่ยวกับกระบวนการของ dd หรือวิธีการทำงานในทางใดทางหนึ่ง คุณสามารถค้นหาได้ใน GitHub:

http://github.com/delt01/dd_printpercent

น่าเสียดายที่เคล็ดลับ SIGUSR1 นี้ใช้ได้กับ GNU dd เท่านั้น (จากแพ็คเกจ coreutils) หรือโหมด 'dd' ของ busybox ด้วยคุณสมบัติเฉพาะนั้นที่เปิดใช้งานในเวลารวบรวม ไม่ทำงานกับหุ้น 'dd' ที่รวมอยู่ในระบบ BSD ส่วนใหญ่รวมถึง FreeBSD และ OS X ... :(


ลิงก์ตาย
ishmael

1

คุณสามารถดูความคืบหน้าของโครงการ coreutils ใด ๆ progress - Coreutils Progress Viewerโดยใช้

มันสามารถตรวจสอบ:

cp mv dd tar cat rsync grep fgrep egrep ตัดการเรียงลำดับ md5sum sha1sum sha224sum sha256sum sha384sum sha384sum sha512sum adb gzip gunzip bzip2 xz unxz lzma unlzma 7z

คุณสามารถดูmanpage

คุณสามารถใช้มันในหน้าต่างเทอร์มินัลแยกขณะที่คำสั่งกำลังทำงานหรือเปิดใช้งานด้วยคำสั่ง dd:

dd if=/dev/sda of=file.img & progress -mp $!

ที่นี่จะ&ใช้คำสั่งแรกและดำเนินการต่อทันทีแทนที่จะรอจนกว่าคำสั่งจะจบลง

คำสั่งความคืบหน้าเปิดตัวด้วย: -mดังนั้นจึงรอจนกว่ากระบวนการที่ตรวจสอบจะสิ้นสุดลง-pดังนั้นจึงตรวจสอบ pid ที่กำหนดและ$!เป็นคำสั่ง pid ล่าสุด

หากคุณออก dd ด้วย sudo คุณก็ต้องมีความคืบหน้าด้วยเช่นกัน:

sudo dd if=/dev/sda of=file.img &
sudo progress -m
# with no -p, this will wait for all coreutil commands to finish
# but $! will give the sudo command's pid
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.