วิธีการเรียก rsync ซ้ำ ๆ จนกระทั่งไฟล์ถูกถ่ายโอนสำเร็จ


27

ฉันพยายามซิงค์ไฟล์จากเซิร์ฟเวอร์ระยะไกลที่ไม่น่าเชื่อถือซึ่งหมายความว่าการเชื่อมต่อมีแนวโน้มที่จะล้มเหลว "แบบสุ่ม" ด้วย

rsync: การเชื่อมต่อปิดโดยไม่คาดคิด

Rsync ถูกเรียกด้วย - บางส่วนดังนั้นฉันจึงสามารถเรียก rsync แบบวนซ้ำจนกว่าไฟล์จะถูกถ่ายโอนอย่างสมบูรณ์ ดูเหมือนจะไม่มีธงที่จะบอก rsync ให้ลองใหม่

อะไรจะเป็นวิธีที่ดีที่สุดในการเขียนสคริปต์ ทุบตีสำหรับวง?


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

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

ฉันช็อคเมื่อพบว่า rsync ไม่มีความสามารถในการลองอีกครั้งจริง ๆ !
Michael

rsync - บางส่วน - ผนวกมีความสามารถในการลองอีกครั้งด้วยตนเองหรือในสคริปต์ตรวจสอบรหัสส่งคืน ทำซ้ำจาก: superuser.com/questions/302842/…
rickfoosusa

คำตอบ:


29

หากคุณกำลังซิงค์ทุกอย่างในการซิงค์ครั้งเดียวให้โทร rsync แบบวนซ้ำจนกว่า rsync จะให้รหัสส่งคืนที่สำเร็จ

สิ่งที่ต้องการ:

RC=1 
while [[ $RC -ne 0 ]]
do
   rsync -a .....   
   RC=$?
done

วิธีนี้จะวนซ้ำเรียก rsync จนกว่าจะให้โค้ดส่งคืนเป็น 0 คุณอาจต้องการเพิ่มสลีปในนั้นเพื่อไม่ให้ DOSing เซิร์ฟเวอร์ของคุณ


28
คุณสามารถเขียนในขณะที่! rsync -a .... ; ทำ sleep 5; เสร็จแล้ว
Justin

1
เพียงแค่ต้องระวังวิธีการใช้งานของคุณตัวอย่างเช่นหากพยายามเรียกใช้ผ่าน cron คุณอาจพบปัญหาการทำงานพร้อมกัน
Keiran Holloway

3
สิ่งนี้จะกลายเป็นการวนซ้ำไม่สิ้นสุดหากมีข้อผิดพลาดที่ไม่ต่อเนื่อง (เช่นข้อผิดพลาดในการอนุญาตการอ่านหรือเขียนไฟล์) ฉันขอแนะนำให้ตรวจสอบสถานะการออกของ rsync สำหรับข้อผิดพลาดเครือข่ายเฉพาะเช่นRC=12; while [[ $RC -eq 12 || $RC -eq 30 ]](หรือสถานะการออกใด ๆ ที่คุณเห็นจากการดรอปของเครือข่าย)
Gordon Davisson

1
ในขณะที่ฉันไม่ได้ทำงานแบบนี้ (สมบูรณ์) แบบไม่ต้องใส่ข้อมูลลูปอนันต์และการเกิดพร้อมกันนั้นไม่ใช่ปัญหามากขอบคุณ
Bruno Lopes

2
มันเป็นความอัปยศ rsync ที่ไม่ได้มีคุณสมบัตินี้อยู่ภายในเนื่องจากการวนรอบใด ๆ ที่ใช้เชลล์จะให้รหัสผ่านในกรณีที่การตรวจสอบอัตโนมัติไม่พร้อมใช้งานหรือเหมาะสม
Michael

11

ฉันพบปัญหาเดียวกันนี้ในขณะที่ย้อนกลับไป ในที่สุดฉันก็เขียนอะไรบางอย่างที่คล้ายกับคำตอบของดาวิด แต่ก็ลองนิดหน่อยด้วยการลองใหม่ ๆ ตอบสนองต่อ Ctrl-C และอื่น ๆ : http://blog.iangreenleaf.com/2009/03/rsync-and-retrying- จนกว่าเรา-GET-it.html


1

purtting มันทั้งหมดพร้อมกับ sshpass

while ! sshpass -p 'xxxx' rsync --partial --append-verify --progress -a -e 'ssh -p 22' /source/ remoteuser@1.1.1.1:/dest/; do sleep 5;done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.