กลับมาใช้งาน rsync ผ่าน SSH อีกครั้งหลังจากการเชื่อมต่อขาดหรือไม่


45

ฉันต้องถ่ายโอนข้อมูลจำนวนมาก (> 80 GB) ผ่าน ssh โดยใช้ rsync ทุกอย่างทำงานได้ดี แต่การเชื่อมต่อ DSL ที่ส่งข้อมูลสำรองจะลดลงหนึ่งครั้งทุก ๆ 24 ชั่วโมงนานถึง 3 นาที (ผู้ให้บริการสวิตชิ่งไม่ใช่ตัวเลือก)

ฉันจะทำอย่างไร:

  1. รีสตาร์ทการถ่ายโอนโดยอัตโนมัติเมื่อการเชื่อมต่อสำรอง?

  2. ตรวจสอบว่าคำสั่ง rsync สองคำสั่งไม่ทำงานโดยบังเอิญหรือไม่


คุณไม่สามารถตรวจสอบรหัสส่งคืนได้หรือไม่ while ./run_script; do echo "Retrying..."; done; echo "Done."ตรวจสอบให้แน่ใจว่าได้run_scriptรับผลตอบแทน0จากความสำเร็จ
Kerrek SB

ซ้ำเป็นไปได้ของserverfault.com/q/98745
tanius

ข้อมูลที่เป็นประโยชน์บางอย่างที่นี่ - ฉันแค่ต้องการเพิ่มวิธีหนึ่งที่จะแก้ไขปัญหาการขอรหัสผ่านซ้ำได้โดยใช้คำสั่ง 'sshpass' โดยปกติจะต้องติดตั้งด้วย apt-get และอื่น ๆ
Rachael Saunders

คำตอบ:


52

ต่อไปนี้จะเป็นประโยชน์:

#!/bin/bash

while [ 1 ]
do
    rsync -avz --partial source dest
    if [ "$?" = "0" ] ; then
        echo "rsync completed normally"
        exit
    else
        echo "Rsync failure. Backing off and retrying..."
        sleep 180
    fi
done

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


1
ขอบคุณฉันลองตอนนี้ ... แต่ควร: ถ้า ["$" = "0"] ไม่ใช่: ถ้า ["$?" == "0"] (ตัวดำเนินการเปรียบเทียบ)?

1
ไม่มีในทุบตี "=" คือสตริงเท่าเทียมกัน (หนึ่งในหลายสิ่งหลายอย่างที่ทำให้เกิดความสับสนผมคิดว่า!)
ปีเตอร์

6
== เป็นนามแฝงสำหรับ =: D
bbaja42

8
อาน่ารู้ดี ทุบตีจะไม่หยุดที่จะแปลกใจ / น่ากลัวฉัน :-P
ปีเตอร์

2
ไปงานเลี้ยงสายอย่างไรก็ตามสำหรับลูกหลาน: A) เพียงใช้: ถ้า rsync -avz - ปลายทางแหล่งที่มาบางส่วน; จากนั้น ... B) ถ้าคุณต้องการเปรียบเทียบค่าอินทิกรัลถ้าใช้วงเล็บคู่สำหรับการขยายเลขคณิต: if (($? = 0)) จากนั้น;
user18402

7

สิ่งนี้ทำเหมือนกับคำตอบของ Peter มาก แต่ให้ตัวเลือกแก่ผู้ใช้ว่าต้องการใช้ไฟล์ระยะไกลแบบใดและเขาต้องการบันทึกไว้ที่ไหน (เช่นเดียวกับการดำเนินการ rsync ผ่าน ssh) แทนที่ USER และ HOST ด้วยชื่อผู้ใช้และโฮสต์ของคุณตามลำดับ

#! / bin / ทุบตี
echo -e "โปรดป้อนพา ธ ไฟล์แบบเต็ม (Escape):"
อ่านเส้นทาง -r
echo "เส้นทาง: $ path"
echo -e "ป้อนปลายทาง:"
อ่าน -r dst
echo "ปลายทาง: $ dst"
ในขณะที่ [1]
ทำ
    rsync --progress --partial --append -vz -e ssh "USER @ HOST: $ path" $ dst
    ถ้า ["$?" = "0"]; แล้วก็
        echo "rsync เสร็จสมบูรณ์ตามปกติ"
        ทางออก
    อื่น
        echo "rsync ล้มเหลวกำลังลองใหม่ในอีกสักครู่ ... "
        นอน 60
    Fi
เสร็จแล้ว

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

หมายเหตุ:ใช้สิ่งนี้เฉพาะเมื่อคุณเปิดใช้งานการลงชื่อเข้าใช้กุญแจสาธารณะด้วย ssh ของคุณมิฉะนั้นจะขอรหัสผ่านเมื่อรีสตาร์ท (ฆ่าฟังก์ชันการทำงานทั้งหมดของสคริปต์)


1
นี่คือคำตอบที่ดีที่สุดของคำถามเดิม นอกจากนี้ยังนำไปใช้กับสำเนาที่มีคำตอบที่ไม่ถูกต้องที่: serverfault.com/questions/98745/…
rickfoosusa

5

supervisor daemon (ผู้จัดการกระบวนการควบคุม) สามารถทำงานได้ดีมากหลังจากสร้างใบรับรอง rsa ทั้งสองด้านโดยมีการกำหนดค่าที่คล้ายกันดังนี้: (/ etc / supervisor / supervisord.conf เป็นเส้นทางไฟล์การกำหนดค่าบนระบบที่ใช้เดเบียน)

[program:rsync-remoteserver]
command=rsync -avz --progress root@server.com:/destination /backup-path
stdout_logfile=/out-log-path  
stderr_logfile=/errlogpath

1

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

rsync --partial --update --progress -r [SOURCE] [DESTINATION]


2
--updateข้ามไฟล์ที่มีอยู่แล้ว ... รวมถึงไฟล์ที่ยังไม่ได้คัดลอกไปยังเป้าหมายอย่างสมบูรณ์ ฉันคิดว่ามันขัดกับกรณีการใช้งานส่วนใหญ่
durum

@durum มันไม่เป็นความจริงอย่างน้อยใน rsync 3.1.2 หลังจากการขัดจังหวะการถ่ายโอนฉันเห็นว่ามันทำงานอย่างถูกต้องในไฟล์เดียวกัน ผมใช้ rsync ผ่าน SSH rsync --partial --update file1 remotehost:file1คำสั่งเป็น หลังจากถ่ายโอน 15% ฉันทำลายการถ่ายโอน (kill -KILL)
filiprem
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.