แสดงความคืบหน้าโดยรวมใน rsync: เป็นไปได้ไหม


229

ฉันค้นหาตัวเลือกนี้แล้ว แต่พบวิธีแก้ปัญหาที่เกี่ยวข้องกับการแก้ไขที่กำหนดเองเท่านั้น ความจริงที่ว่ามันไม่ได้แสดงใน - ช่วยเหลือและไม่สามารถหาข้อมูลได้อีกมากแสดงว่าคำตอบคือ 'ไม่' แต่ฉันต้องการเห็นสิ่งนี้ยืนยัน

เป็นไปได้ไหมที่จะแสดงความคืบหน้าการถ่ายโอนไฟล์ทั้งหมดด้วย rsync?


22
ตั้งแต่ rsync 3.1.0 ขณะนี้มีความคืบหน้าการถ่ายโอนไฟล์ทั้งหมดรวมอยู่ด้วย ดูรายละเอียดที่answer serverfault.com/a/441724/107793
Florian Feldhaus

14
โปรดเปลี่ยนคำตอบที่ยอมรับ @ คำตอบของเดวิดไร้ประโยชน์อย่างสมบูรณ์
Navin

ดูเพิ่มเติมunix.stackexchange.com/q/215271/9454
Martin Schröder

คำตอบ:


36

danakim ถูกต้อง ไม่มีวิธีการเล็กน้อยในการเพิ่มตัวบ่งชี้ความคืบหน้าโดยรวม

เหตุผลนี้คือเมื่อ rsync ดูรายการของไฟล์ที่จะซิงค์มันไม่ทราบล่วงหน้าว่าไฟล์ใดที่จะต้องเปลี่ยน หากคุณทำการถ่ายโอนเดลต้าตัวเองจะต้องคำนวณล่วงหน้าเพื่อให้ภาพรวมของงานที่ต้องทำ

วิธีที่ง่ายที่สุดในการคำนวณจำนวนงานที่ต้องทำคือการทำจริง ๆ


42
คุณยังสามารถมีตัวบ่งชี้อย่างง่ายเช่น (การถ่ายโอนข้อมูล + ข้ามข้อมูล) / (ข้อมูลทั้งหมดในแหล่งที่มา) หรือ (# ไฟล์ที่ถ่ายโอนหรือข้าม) / (# ไฟล์ในแหล่งที่มา) มันจะไม่แม่นยำโดยเฉพาะ แต่จะให้ความคิด เหมาะสำหรับเมื่อคุณทำการโอนย้ายขนาดใหญ่ในตอนท้ายของวันและคุณสงสัยว่าจะรอรอบและปิดเครื่องคอมพิวเตอร์หรือปล่อยให้มันทำงานในตอนกลางคืน ...
naught101

3
ฉันไม่เชื่อว่าข้อสรุปนั้นถูกต้อง ฉันคิดว่า @ naught101 มีความยุติธรรมกับคำถามมากขึ้นและฉันคิดว่าการคาดเดาคำตอบที่ไม่ได้ใช้--size-onlyหรือสิ่งที่คล้ายนั้นไม่ถูกต้องต่อไป
Evan Carroll

2
ตอนที่ฉันเขียนคำตอบมันถูกต้อง - rsync ไม่มีกลไกสำหรับตัวบ่งชี้ความคืบหน้าโดยรวม และใช่คุณสามารถเขียนของคุณเอง แต่คนน้อยมากที่จะ
David Mackintosh

6
ความคิดเห็นสำหรับผู้มาใหม่: ตอนนี้เป็นไปได้แล้ว: serverfault.com/a/441724/422003
imposeren

ใช้สองรอบครั้งแรกด้วย "--dry-run" (จำนวนไฟล์ที่คาดไว้ทั้งหมด) และวินาทีที่มีเอาต์พุตโดยละเอียดบันทึกไว้ในไฟล์ (และการนับบรรทัดเสร็จสมบูรณ์ ข้อเสียคือการสแกนไดเรกทอรีที่ซ้อนกันขนาดใหญ่สองครั้ง ทั้งนี้ขึ้นอยู่กับความต้องการเช่นสร้างความมั่นใจในการย้ายข้อมูลลูกค้าอย่างปลอดภัยซึ่งอาจเป็นที่ยอมรับได้
อีฟส์

377

ขณะนี้มีวิธีที่เป็นทางการในการทำเช่นนี้ใน rsync (รุ่น 3.1.0 โปรโตคอลรุ่น 31, ทดสอบกับ Ubuntu Trusty 14.04)

#> ./rsync -a --info=progress2 /usr .
    305,002,533  80%   65.69MB/s    0:00:01  xfr#1653, ir-chk=1593/3594)

ฉันลองกับ/usrโฟลเดอร์ของฉันเพราะฉันต้องการคุณสมบัตินี้สำหรับการถ่ายโอนระบบไฟล์ทั้งหมดและ/usrดูเหมือนจะเป็นตัวอย่างที่ดี

--info=progress2ให้เปอร์เซ็นต์โดยรวมที่ดีถึงแม้ว่ามันจะเป็นเพียงค่าบางส่วน อันที่จริง/usrโฟลเดอร์ของฉันมีมากกว่า 6 กิ๊ก:

#> du -sh /usr
6,6G    /usr/

และrsyncใช้เวลาในการสแกนทั้งหมด เกือบตลอดเวลาที่ฉันได้เห็นเปอร์เซ็นต์เสร็จสมบูรณ์ประมาณ 90% แต่ก็รู้สึกสบายใจที่เห็นบางอย่างกำลังถูกคัดลอก :)

อ้างอิง:


19
โปรดทราบว่าสิ่งนี้ได้ลงจอดใน 3.1.0 นอกจากนี้ยังเป็นสิ่งสำคัญที่จะต้องทราบว่าสิ่งนี้ไม่จำเป็นต้องแม่นยำในมุมมองเวลา โดยพื้นฐานแล้วจะแสดงปริมาณข้อมูลที่ได้รับการยืนยันว่ามีอยู่บนปลายรีโมต และอัตราคืออัตราที่ข้อมูลกำลังถูกเรียนรู้ว่าถูกต้องบนรีโมตปลายทาง (ไม่ว่ามันจะเป็นแบบนั้นอยู่แล้วหรือมีการถ่ายโอนข้อมูลใหม่และทำให้ถูกต้อง) ดังนั้นแม้ว่าจะมีประโยชน์มากคุณต้องเข้าใจคำเตือน
Kevin Cox

15
หากต้องการใช้สิ่งนี้บน OSX กับ homebrew "ชงประปา homebrew / dupes; ชงติดตั้ง rsync"
Matt Carrier

18
น่าสังเกตว่า--info=progress2ไม่สามารถใช้งานได้-v
sanmai

42
เพิ่ม--no-i-rสวิตช์เช่นกันดังนั้นrsyncอย่าสแกนทีละส่วน แต่จะสมบูรณ์ก่อนที่จะทำสำเนาและรู้ว่า + แสดงจำนวนงานที่เหลืออยู่
อเล็กซ์

16
โปรดทราบว่าคุณสามารถใช้--human-readable(หรือ-h) เพื่อดูขนาดทั้งหมดเป็น MB / GB .. กำลังดำเนินการ
Nux

45

คุณสามารถใช้ 'pv' ( apt-get install pvกับ Debian และ ubuntu) ฉันแนะนำให้ตรวจสอบจำนวนไฟล์ที่ถ่ายโอนเนื่องจากจำนวนข้อมูลที่ถ่ายโอนนั้นไม่มีความสัมพันธ์กับขนาดของไฟล์ แต่อยู่ที่เดลต้าระหว่างต้นทางและปลายทาง และการนับไฟล์จะนับความคืบหน้าเหมือนกันสำหรับเดลต้าใหญ่หนึ่งอันและอีกอันหนึ่งที่มีเดลต้าขนาดเล็ก ซึ่งหมายความว่าในกรณีใด ๆ การประเมิน ETA อาจอยู่ไกล การทางพิเศษแห่งประเทศไทยขนาดใช้งานได้เฉพาะในกรณีที่ปลายทางของคุณว่างเปล่าในกรณีนี้ delta == ขนาดของแหล่งที่มา

แนวคิดทั่วไปคือการปล่อยหนึ่งบรรทัดต่อไฟล์ 'ถ่ายโอน' จาก rsync และนับบรรทัดเหล่านั้นด้วย 'pv':

rsync -ai / source remote: / dest | pv -les [จำนวนไฟล์]> / dev / null

ฉันมักจะสำรองระบบไฟล์ทั้งหมด (ด้วยเหตุผลหลายประการ) ในกรณีนี้คุณสามารถใช้จำนวนที่ถูกกว่าdfเพื่อให้ได้จำนวนไฟล์ (แทนที่จะเป็นduหรือfindจะข้ามไปที่ลำดับชั้นแหล่งข้อมูลของคุณอีกครั้งหลังจาก rsync ทำ) ตัวเลือก -x ปรากฏขึ้นเพื่อให้แน่ใจว่า rsync ยังคงอยู่ในระบบไฟล์ต้นทางเดียวกัน (และไม่ปฏิบัติตามการเมาท์ภายในอื่น ๆ ):

rsync -aix / source remote: / dest | pv -les $ (df -i / source | perl -ane 'พิมพ์ $ F [2] ถ้า $ F [5] = ~ m: ^ /:')> / dev / null

หากคุณต้องการนับไฟล์ใน / แหล่งที่มาด้วยวิธีทั่วไปให้ใช้find /source|wc -l(คำเตือนอีกครั้ง: อาจช้าและหนักบน I / O)


1
ตามที่ระบุไว้ zerodeuz ใช้ "df" เฉพาะเมื่อคุณ rsyncing พาร์ทิชันทั้งหมดตามที่df -i /sourceได้รับจำนวน inodes (ไฟล์) จากพาร์ทิชันทั้งหมดที่ / แหล่งที่อยู่ มิฉะนั้นใช้'ค้นหา' เพื่อนับไฟล์ภายในไดเรกทอรีภายในนิพจน์ "$ ()"
lepe

1
อีกทางเลือกหนึ่งduหรือfind- สมมติว่าคุณกำลังทำสำเนาที่ไม่สมบูรณ์หรือทำการอัปเดตแบบแทนที่ด้วยการลบ - เพื่อใช้rsync -ai --dry-runในการรับรายชื่อไฟล์เดียวกันการทำงานหลักจะถูกส่งไปยังpv
Izkata

32

ข้อมูลต่อไปนี้ใช้กับ rsync เวอร์ชัน 3.0.0 และสูงกว่า ตัวเลือกที่อธิบายด้านล่างได้รับการแนะนำในรุ่นที่วางจำหน่ายในวันที่ 1 มีนาคม 2008

พร้อมกับ--info = progress2คุณยังสามารถใช้ตัวเลือก--no-inc-recursive (หรือนามแฝง--no-ir ที่สั้นกว่า) เพื่อปิดใช้งานการเรียกซ้ำที่เพิ่มขึ้น

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

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

ต่อไปนี้มาจากคู่มือ rsync (แหล่งที่มา - http://rsync.samba.org/ftp/rsync/rsync.html ):

-r, - recursive

สิ่งนี้จะบอก rsync ให้คัดลอกไดเรกทอรีซ้ำ ดูเพิ่มเติม --dirs (-d) เริ่มต้นด้วย rsync 3.0.0 อัลกอริทึมแบบเรียกซ้ำที่ใช้อยู่ตอนนี้เป็นการสแกนแบบเพิ่มหน่วยความจำซึ่งใช้หน่วยความจำน้อยกว่ามากและเริ่มการถ่ายโอนหลังจากการสแกนไดเรกทอรีสองสามรายการแรกเสร็จสมบูรณ์ การสแกนที่เพิ่มขึ้นนี้มีผลต่ออัลกอริทึมการเรียกซ้ำของเราเท่านั้นและจะไม่เปลี่ยนการถ่ายโอนที่ไม่เกิดซ้ำ เป็นไปได้ก็ต่อเมื่อการถ่ายโอนทั้งสองด้านเป็นเวอร์ชั่น 3.0.0 เป็นอย่างน้อย

ตัวเลือกบางตัวต้องการ rsync เพื่อทราบรายชื่อไฟล์ทั้งหมดดังนั้นตัวเลือกเหล่านี้จะปิดการใช้งานโหมดเรียกซ้ำแบบส่วนเพิ่ม เหล่านี้รวมถึง: - ลบก่อนหน้านี้ - ลบหลัง, - เปิดใหม่ว่างเปล่า -dirs และ - วันที่อัพเดท ด้วยเหตุนี้โหมดลบเริ่มต้นเมื่อคุณระบุ --delete คือ - ลบ - ในระหว่างเมื่อปลายทั้งสองของการเชื่อมต่ออย่างน้อย 3.0.0 (ใช้ --del หรือ - ลบ - ระหว่างเพื่อขอโหมดการลบที่ปรับปรุงนี้ อย่างชัดเจน) ดูเพิ่มเติมที่ --delete-delay ตัวเลือกที่ดีกว่าการใช้ --delete-after

การเรียกซ้ำที่เพิ่มขึ้นสามารถปิดใช้งานได้โดยใช้ตัวเลือก--no-inc-recursiveหรือนามแฝง--no-ir ที่สั้นกว่า

ดูเพิ่มเติมที่https://rsync.samba.orgสำหรับความแตกต่างของรุ่นที่เฉพาะเจาะจง (เลื่อนลงและตรวจสอบลิงก์ข่าวประชาสัมพันธ์)


3
ขอบคุณสำหรับสิ่งนี้คำตอบอื่น ๆ ส่งผลให้อายุ% ขึ้นไปเรื่อย ๆ !
artfulrobot

28

สำหรับการถ่ายโอนยาวผมมีความสุขกับการทำงานdu -sทั้งสองด้าน แม้ว่าwatch -n1 du -sฉันจะรู้สึกกังวลจริงๆ

watchรันคำสั่ง ( du -sที่นี่) เป็นระยะ (ทุก ๆ 1 วินาทีที่นี่) และแสดงเอาท์พุทแบบเต็มจอ


4
ขอบคุณสำหรับตัวอย่างของwatchคำสั่ง!
Cam

2
//, ฉลาด! ตาม linfo.org: "คำสั่ง du (เช่นการใช้ดิสก์) รายงานขนาดของแผนผังไดเร็กทอรีที่รวมเนื้อหาทั้งหมดและขนาดของไฟล์แต่ละไฟล์ซึ่งทำให้มีประโยชน์สำหรับการติดตาม hogs space เช่นไดเรกทอรีและไฟล์ ที่ใช้พื้นที่จำนวนมากหรือมากเกินไปบนฮาร์ดดิสก์ (HDD) หรือสื่อเก็บข้อมูลอื่น "
นาธาน Basanese

10
ฉันไม่รู้ว่าคุณถ่ายโอนไปนานเท่าไหร่ที่คุณทำงานได้ du ช้าเหมือนนรกเมื่อผลลัพธ์จะอยู่ในรูปแบบไฟล์ TB และ M
ไม่มีใคร

2
สำหรับ "การถ่ายโอนแบบยาว" ของฉันการดำเนินการ du ใช้เวลาประมาณหนึ่งชั่วโมงจึงจะเสร็จสมบูรณ์ในระหว่างที่ rsync ทำงานช้าลงมากเพราะพวกเขากำลังต่อสู้เพื่อเข้าถึงดิสก์
Abhi Beckert

12

โดยทั่วไปไม่มี คุณสามารถแสดงความคืบหน้าต่อไฟล์ด้วยแฟล็ก --progress แต่นั่นก็เกี่ยวกับมัน

ฉันเดาว่าคุณสามารถเขียนเสื้อคลุมรอบ ๆ หรือใช้แผ่นแปะใดก็ได้ที่คุณพบอยู่แล้ว แต่คุณต้องถามตัวเองว่ามันคุ้มหรือไม่คุณต้องการความคืบหน้าทั้งหมดสำหรับ rsync หรือไม่?


นี่คือสคริปต์ตัวหุ้มที่แสดงความคืบหน้าโดยรวมและความคืบหน้าของไฟล์เป็นแถบความคืบหน้าที่ดี: gist.github.com/JohannesBuchner/4d61eb5a42aeaad6ce90
j13r

1
คุณสามารถเปลี่ยนวิธีการ--progressทำงานโดยใช้--info=progress2มันจะแสดงให้คุณเห็นความคืบหน้าทั่วโลก คุณจะต้องปิดการใช้งานขั้นตอนวิธีการเวียนเกิดที่เพิ่มขึ้นเพื่อให้เป็นประโยชน์เพื่อให้--info=progress2 --no-inc-recursive
เสื่อ

@ j13r คุณสามารถแบ่งปันส่วนสำคัญนี้เป็นคำตอบได้เช่นกัน! มันเป็นตัวเลือกที่ยอดเยี่ยม!
skywinder

8

ฉันใช้คำตอบจาก zerodeux และเขียนสคริปต์ทุบตีเล็ก ๆ ของตัวเอง:

#!/bin/bash

RSYNC="ionice -c3 rsync"
# don't use --progress
RSYNC_ARGS="-vrltD --delete --stats --human-readable"
SOURCES="/dir1 /dir2 /file3"
TARGET="storage::storage"

echo "Executing dry-run to see how many files must be transferred..."
TODO=$(${RSYNC} --dry-run ${RSYNC_ARGS} ${SOURCES} ${TARGET}|grep "^Number of files transferred"|awk '{print $5}')

${RSYNC} ${RSYNC_ARGS} ${SOURCES} ${TARGET} | pv -l -e -p -s "$TODO"

7

ฉันยังค้นหาวิธีแสดงความคืบหน้าโดยรวมด้วย rsync และฉันพบผู้ตอบที่มีประโยชน์จากโพสต์นี้: https://stackoverflow.com/questions/7157973/monitoring-rsync-progress

โดยทั่วไปคุณสามารถใช้--info = progress2ในรุ่น dev ของ rsync 3.1.0 นี่คือสิ่งที่หมอพูด:

นอกจากนี้ยังมีตัวเลือก --info = progress2 ที่แสดงผลสถิติตามการถ่ายโอนทั้งหมดแทนที่จะเป็นไฟล์เดี่ยว ใช้แฟล็กนี้โดยไม่แสดงชื่อไฟล์ (เช่นหลีกเลี่ยง -v หรือระบุ --info = name0 หากคุณต้องการดูว่าการถ่ายโอนทำได้อย่างไรโดยไม่ต้องเลื่อนหน้าจอด้วยชื่อจำนวนมาก (คุณไม่จำเป็นต้องระบุ - ตัวเลือกความคืบหน้าเพื่อใช้ --info = progress2.)


1
--info=name0is gold 🌈👑
ipatch

6

ฉันใช้คำตอบจาก zerodeux และเขียนสคริปต์ BASH ของฉัน:

#!/bin/bash

RSYNC="ionice -c3 rsync"
# don't use --progress
RSYNC_ARGS="-vrltD --delete --stats --human-readable"
SOURCES="/dir1 /dir2 /file3"
TARGET="storage::storage"

#echo "Executing dry-run to see how many files must be transferred..."
TODO=$(find ${SOURCES} | wc -l)

${RSYNC} ${RSYNC_ARGS} ${SOURCES} ${TARGET} | pv -l -e -p -s "$TODO"

ฉันเปลี่ยนสิ่งที่ต้องทำแห้งเป็น

TODO=$(find ${SOURCES} | wc -l)

พบจำนวนไฟล์ที่รวดเร็วมาก!


พบกับผลงานเพื่อให้ดีกว่า rsync --dry วิ่ง!
hopeeekr

4
findใช้งานได้เฉพาะในกรณีที่คุณอยู่rsyncในพื้นที่ rsync --dry-runทำงานกับแหล่งข้อมูลระยะไกลได้เช่นกัน ...
voretaq7

6

หากคุณไม่มี rsync ล่าสุด (เช่น OS X มี 2.6.9) และไม่สามารถใช้งานได้--info=progress2นี่เป็นอีกทางเลือกหนึ่งในการช่วยตัวคุณเองจากหน้าเลื่อนข้อความที่กำลังดำเนินการ:

rsync -aPh <source> <destination> | xargs -L1 printf "\33[2K\rTransferring: %s"

ซึ่งจะพิมพ์ชื่อของไฟล์ล่าสุดที่ถูกถ่ายโอนในบรรทัดเดียว:

Transferring: the-latest.file


4

ใช้

lsof -ad3-999 -c rsync

หากต้องการดูว่าไฟล์ใด rsync ที่เปิดอยู่ในปัจจุบัน (จะแสดงขนาดไฟล์) สำเนาของ rsync ลงในไฟล์ที่ซ่อนอยู่ในเครื่อง


ฉันต้องการโพสต์สิ่งนี้for i in $(pgrep 'rsync'); do ls -l /proc/$i/fd; doneแต่ทางออกของคุณง่ายขึ้น
Aalex Gabi

4

ฉันต้องการแสดงความคิดเห็น แต่ไม่มีชื่อเสียงเพียงพอ ในการตอบกลับความคิดเห็นของ naught101 ต่อคำตอบที่เลือกตัวเลือก --progress จะแสดงจำนวนไฟล์ที่ถูกถ่ายโอนจากจำนวนรวมที่จะโอน ฉันไม่ได้ตระหนักถึงสิ่งนี้จนกว่าจะดูโพสต์นี้และดูผลลัพธ์อย่างระมัดระวังมากขึ้น

สถิติ 'เพื่อตรวจสอบ' แสดงจำนวนไฟล์ที่เหลือจากยอดรวม นี่คือการใช้งานมากที่สุดเมื่อ rsync ไปยังปลายทางใหม่เพื่อให้คุณรู้ว่าไฟล์ทั้งหมดจะถูกคัดลอกอย่างสมบูรณ์

จากหน้าคน:

When [each] file transfer  finishes,  rsync  replaces  the
progress line with a summary line that looks like this:

    1238099 100%  146.38kB/s    0:00:08  (xfer#5, to-check=169/396)

In this example, the file was  1238099  bytes  long  in
total,  the average rate of transfer for the whole file
was 146.38 kilobytes per second over the 8 seconds that
it took to complete, it was the 5th transfer of a regu-
lar file during the current rsync  session,  and  there
are 169 more files for the receiver to check (to see if
they are up-to-date or not) remaining out  of  the  396
total files in the file-list.

3

โปรดสังเกตว่าที่นี่ที่ --info = progress2 ไม่น่าเชื่อถืออย่างสมบูรณ์เนื่องจากเปอร์เซ็นต์นี้ขึ้นอยู่กับจำนวนไฟล์ที่ rsync 'รู้' เกี่ยวกับเวลาที่แสดงความคืบหน้า นี่ไม่ใช่จำนวนไฟล์ทั้งหมดที่จำเป็นต้องทำการซิงค์ (เช่นหากพบไฟล์ขนาดใหญ่จำนวนมากในไดเรกทอรีที่ซ้อนกันอย่างลึกซึ้ง) วิธีหนึ่งเพื่อให้แน่ใจว่า --info = progress2 ไม่ได้ 'ย้อนกลับ' ในตัวบ่งชี้ความคืบหน้าคือการบังคับให้ rsync สแกนไดเรกทอรีทั้งหมดซ้ำก่อนที่จะเริ่มการซิงค์ (แทนที่จะเป็นพฤติกรรมเริ่มต้นของการสแกนแบบเรียกซ้ำซ้ำเพิ่ม) โดยการให้ตัวเลือก --no-inc-recursive โปรดทราบว่าตัวเลือกนี้จะเพิ่มการใช้หน่วยความจำ rsync และเวลาทำงานด้วย


การเรียกซ้ำที่เพิ่มขึ้นสามารถปิดใช้งานได้โดยใช้--no-inc-recursiveตัวเลือกหรือ--no-i-rนามแฝงที่สั้นกว่า (ดูคำตอบอื่น)
koppor

2

ฉันใช้สคริปต์ที่ดึงข้อมูลจาก / proc // io สำหรับกระบวนการ rsync (หรือกระบวนการอื่น ๆ สำหรับเรื่องนั้น) และการรู้จำนวนรวมที่จะโอนย้ายจะคำนวณความคืบหน้า

#!/bin/bash

usage()
{
   echo "usage: $0 PID BASEMSIZE [DELAY[s|m|h]]"
}

if [ $# -lt 2 ]; then
   usage
   exit 1
elif [ $# -eq 3 ]; then
   DELAY=$3
else
   DELAY=5s
fi

PID=$1
PBASE=`echo "scale=2; $2/1024"|bc`

R_PID=$PID
W_PID=$PID

R_SPEED_MAX=0
W_SPEED_MAX=0
R_SPEED_CUM=0
W_SPEED_CUM=0
R_SPEED_AVG=0
W_SPEED_AVG=0

ETA=0
ETA_H=0
ETA_M=0
ETA_S=0

while [ ! -r /proc/$PID/io ];
do
   clear
   echo "Waiting for process with PID=$PID to appear!"
   sleep 1
done

B_READ_PREV=`cat /proc/$R_PID/io|awk '$1 ~ /^read_bytes/ {print $2}'`
B_WRITE_PREV=`cat /proc/$W_PID/io|awk '$1 ~ /^write_bytes/ {print $2}'`
T1=`date +%s.%N`

count=0
while true
do
   [ ! -r /proc/$PID/io ] && break
   clear
   B_READ=`cat /proc/$R_PID/io|awk '$1 ~ /^read_bytes/ {print $2}'`
   B_WRITE=`cat /proc/$W_PID/io|awk '$1 ~ /^write_bytes/ {print $2}'`
   BL_READ=`echo "scale=2; ($B_READ-$B_READ_PREV)/1048576"|bc`
   BL_WRITE=`echo "scale=2; ($B_WRITE-$B_WRITE_PREV)/1048576"|bc`
   GB_DONE=`echo "scale=2; $B_WRITE/1073741824"|bc`
   PDONE=`echo "scale=2; $GB_DONE*100/$PBASE"|bc`
   T2=`date +%s.%N`
   TLOOP=`echo "scale=2; ($T2-$T1)/1"|bc`
   R_SPEED=`echo "scale=2; $BL_READ/$TLOOP"|bc`
   W_SPEED=`echo "scale=2; $BL_WRITE/$TLOOP"|bc`

   if [ $count -ge 1 ]; then
      R_SPEED_CUM=`echo "scale=2; $R_SPEED_CUM+$R_SPEED"|bc`
      R_SPEED_AVG=`echo "scale=2; $R_SPEED_CUM/$count"|bc`
      W_SPEED_CUM=`echo "scale=2; $W_SPEED_CUM+$W_SPEED"|bc`
      W_SPEED_AVG=`echo "scale=2; $W_SPEED_CUM/$count"|bc`
      [ `echo "scale=2; $W_SPEED > $W_SPEED_MAX"|bc` -eq 1 ] && W_SPEED_MAX=$W_SPEED
      [ `echo "scale=2; $R_SPEED > $R_SPEED_MAX"|bc` -eq 1 ] && R_SPEED_MAX=$R_SPEED
   fi

   if [ `echo "scale=2; $W_SPEED_AVG > 0"|bc` -eq 1 ]; then
      ETA=`echo "scale=2; (($PBASE-$GB_DONE)*1024)/$W_SPEED_AVG"|bc`
      ETA_H=`echo "scale=0; $ETA/3600"|bc`
      ETA_M=`echo "scale=0; ($ETA%3600)/60"|bc`
      ETA_S=`echo "scale=0; ($ETA%3600)%60"|bc`
   fi

   echo "Monitoring PID: $PID"
   echo
   echo "Read:       $BL_READ MiB in $TLOOP s"
   echo "Write:      $BL_WRITE MiB in $TLOOP s"
   echo
   echo "Read Rate:  $R_SPEED MiB/s ( Avg: $R_SPEED_AVG, Max: $R_SPEED_MAX )"
   echo "Write Rate: $W_SPEED MiB/s ( Avg: $W_SPEED_AVG, Max: $W_SPEED_MAX )"
   echo
   echo "Done: $GB_DONE GiB / $PBASE GiB ($PDONE %)"
   [ `echo "scale=2; $ETA > 0"|bc` -eq 1 ] && printf "ETA: %02d:%02d:%05.2f (%.2fs)\n" $ETA_H $ETA_M $ETA_S $ETA
   echo "Elapsed: `ps -p $PID -o etime=`"

   T1=`date +%s.%N`
   sleep $DELAY
   B_READ_PREV=$B_READ
   B_WRITE_PREV=$B_WRITE
   ((count++))
done
echo "----- Finished -------------------------------------------------------------------"

2

หากเวอร์ชันของคุณrsyncไม่ยอมรับ--info=progress2ตัวเลือกคุณสามารถใช้tqdm:

ติดตั้ง:

pip install tqdm

ใช้:

$ rsync -av / source / dest | tqdm --unit_scale | ห้องสุขา -l
10.0Mit [00:02, 3.58Mit / s]

1

บางทีคุณสามารถรวมpvกับ rsync โดยเฉพาะอย่างยิ่งพารามิเตอร์--sizeได้โดยมีประโยชน์ การดูเอกสารสิ่งที่pv --size $(du -sb . | awk '{print $1}') | rsync -av . host:/your/pathควรทำ

ที่นี่คุณจะพบเอกสารและซอฟต์แวร์

ยังไม่ได้ลองด้วยตัวเอง


1

อาจจะสายไปสักหน่อย แต่ผู้หาคำตอบในอนาคตอาจได้รับประโยชน์

นี่เป็นการบักฉันด้วยดังนั้นฉันคิดว่าฉันจะลงและสกปรกและเขียนสคริปต์แรกของฉัน ต้องมีการติดตั้งแพ็คเกจ zenity (sudo apt-get install zenity) แต่ฉันแน่ใจว่ามันอาจจะมีอยู่แล้ว นอกจากนี้ฉันใช้ wmctrl (การควบคุมตัวจัดการหน้าต่าง) เพื่อเปลี่ยนชื่อของกล่องโต้ตอบความคืบหน้าเมื่อเสร็จสิ้นสามารถติดตั้งได้อย่างง่ายดาย แต่จะไม่สร้างความแตกต่างถ้าคุณไม่ทำ ฉันแค่อยากจะดูว่าเมื่อมันเสร็จในแผงของฉัน

โดยทั่วไปสคริปต์จะขอไดเรกทอรีต้นทางและปลายทางคำนวณเปอร์เซ็นต์ของปลายทางเหนือขนาดต้นทางโดยใช้ du และแสดงแถบความคืบหน้า

หมายเหตุ: ใช้งานได้เฉพาะกับการซิงค์ไดเรกทอรี / ไฟล์ที่สมบูรณ์ (โดยปกติฉันจะใช้เพื่อสำรองข้อมูลแคช apt) ดังนั้นจึงไม่มีตัวเลือก --exclude = / file / in / Source-directory และจะไม่ทำงานหากมีไฟล์ / ไดเรกทอรีในไดเรกทอรีปลายทางไม่อยู่ในไดเรกทอรีต้นทาง ฉันไม่แน่ใจว่าจะทำงานกับแหล่ง / ปลายทางระยะไกลได้หรือไม่เพราะฉันไม่เคยต้องการมันหรือแหล่งข้อมูลเพื่อทดสอบ

PS สคริปต์นี้อาจเขียนได้แย่มากหรือไม่มีประสิทธิภาพมาก (อย่างน้อยสคริปต์ที่นี่) แต่อย่างน้อยก็มีไว้สำหรับวัตถุประสงค์และแน่นอนว่าคุณยินดีที่จะแก้ไขและปรับปรุงให้เหมาะกับความต้องการของคุณ PSS ยังไม่สามารถรับปุ่มยกเลิกเพื่อฆ่า rsync ดังนั้นฉันเพิ่งลบมัน

    #!/bin/bash
set -e;

WELC="Running RsyncP as $USER";

function echo_progress()
{
    while (($TRANSFER_SIZE > 1000));    
    do  
        DEST_SIZE=$(du -s $DEST_FOLDER | cut -d / -f 1); 
        ((TRANSFER_SIZE=$SOURCE_SIZE-DEST_SIZE)); 
        PROGRESS_PERC=$((DEST_SIZE*100/SOURCE_SIZE));
        echo $PROGRESS_PERC;
        sleep 0.1s;
    done;
    echo 100;
    zenity --info --width=250 --title=RsyncP --text="File syncing complete!";
}

function get_input()
{
    dirs=$(zenity --forms --width=500 --title="RsyncP" --text="Enter source And destination directories" --add-entry="Source: " --add-entry="Destination: " --separator=" ");

    SOURCE_FOLDER=$(echo $dirs | cut -d' ' -f 1);
    DEST_FOLDER=$(echo $dirs | cut -d' ' -f 2);

    OPTIONS=-$(zenity --list --title="RsyncP Options" --text="Select rsync options" --separator='' --height=470 --width=470 --checklist --column "activate" --column "Option" --column "Description" FALSE v "Verbose (Terminal only)" FALSE q "Quiet, supress non-error messages (Terminal only)" FALSE P "Progress (Terminal only)" FALSE a "Archive (lrpog)" TRUE r "Recurse into directories" FALSE p "Preserve permissions" FALSE o "Preserve owner" FALSE g "Preserve group" FALSE l "Copy symlinks as symlinks");

    zenity --question --no-wrap --title="RsyncP" --width=500 --text="rsync  $OPTIONS $SOURCE_FOLDER $DEST_FOLDER\nDo you want to continue?";

    SOURCE_SIZE=$(du -s $SOURCE_FOLDER | cut -d / -f 1); 
    DEST_SIZE=$(du -s $DEST_FOLDER | cut -d / -f 1); 
    PROGRESS_PERC=$((DEST_SIZE*100/SOURCE_SIZE)); 
    TRANSFER_SIZE=1001;
}

if [ "$(id -u)" != "0" ]; then
    zenity --question --title=RsyncP --text="$WELC, Continue?";
    get_input;
    rsync  $OPTIONS $SOURCE_FOLDER $DEST_FOLDER & 
    echo_progress | zenity --progress --title=RsyncP --no-cancel --auto-close --text="Copying from \n$SOURCE_FOLDER to \n$DEST_FOLDER" ;

else            
    zenity --question --title=RsyncP --text="$WELC, Continue?";
    get_input; 
    sudo rsync  $OPTIONS $SOURCE_FOLDER $DEST_FOLDER & 
    echo_progress | zenity --progress --title=RsyncP --no-cancel --auto-close --text="Copying from \n$SOURCE_FOLDER to \n$DEST_FOLDER" ;
fi

ลองดู YAD มันเป็นทางแยก (เขียนใหม่) ของ Zenity และเหมือน Zenity ... แต่ใช้กับสเตียรอยด์ สคริปต์ของฉันใช้สำหรับทุกสิ่งที่มีทางเลือกสู่ Zenity เนื่องจากฉันมีเครื่องจักรที่มีเฉพาะ Zenity อยู่ ตัวเลือกคำสั่งนั้นคล้ายกันมากสำหรับสิ่งนั้น แต่คุณเพียงแค่กำจัดสิ่งมีค่าจำนวนมากด้วย Zenity
DocSalvager
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.