ฉันจะตรวจสอบว่า rsync ทำการเปลี่ยนแปลงในทุบตีได้อย่างไร?


12

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

rsync -aEivm --delete /path/to/remote/ /path/to/local/

if [ $? -eq 0 ]; then
    # Success do some more work!
else
    # Something went wrong!
    exit 1;
fi

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


คุณได้-vอยู่ที่นั่นดังนั้นมันจึงให้ข้อมูลที่คุณต้องการในการ stdout ... เช่นรายชื่อไฟล์ที่ถูกส่งจริง ./ถ้าไม่มีอะไรที่มีการเปลี่ยนแปลงที่เพียง
goldilocks

อา! ถ้าฉันเอา -v ออกมาและใช้ -i แทนแล้วใช้การตรวจสอบสตริงที่ไม่ว่างในคำสั่ง rsync
James White

ดูเหมือนว่าคุณจะพบทางออกด้วยตัวเอง? :-)
Bjorn Munch

2
a=$("rsync command")คุณสามารถใช้ นี้จะดำเนินการrsyncสั่งการและการจัดเก็บในstdout aจากนั้นคุณสามารถเรียกใช้การทดสอบบนa
nitishch

1
คุณสามารถเพิ่ม| grep /หรืออะไรทำนองนั้นจากนั้นตรวจสอบสถานะการออกของ grep ด้วย$?ควรเป็น 1 หากไม่มีผลลัพธ์
Bjorn Munch

คำตอบ:


9

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

RSYNC_COMMAND=$(rsync -aEim --delete /path/to/remote/ /path/to/local/)

    if [ $? -eq 0 ]; then
        # Success do some more work!

        if [ -n "${RSYNC_COMMAND}" ]; then
            # Stuff to run, because rsync has changes
        else
            # No changes were made by rsync
        fi
    else
        # Something went wrong!
        exit 1
    fi

ข้อเสียที่เป็นไปได้คุณจะต้องสูญเสียผลลัพธ์ verbose แต่คุณสามารถบันทึกลงในไฟล์แทนได้เสมอ


1

ฉันต้องการทางออกที่เข้มงวดยิ่งขึ้น ฉันไม่ต้องการ grep Number of created files:(ข้อความอาจเป็นภาษาอื่น) หรือลบบรรทัดทั้งหมด แต่-vเอาท์พุทสองอัน(ใครจะรู้ว่าrsyncจะสรุปการพิมพ์ในรุ่นถัดไปหรือไม่)

ฉันพบว่าคุณสามารถตั้งค่ารูปแบบของrsyncบันทึก แต่ไม่ใช่รูปแบบของ stdout (ดูman rsyncd.conf)

ตัวอย่างเช่นเพิ่ม "ไฟล์ที่เปลี่ยนแปลง!" ไปยังแต่ละบรรทัดด้วยไฟล์ที่มีการเปลี่ยนแปลงจริงจากนั้นgrep:

rsync -a \
    --log-file=/tmp/rsync.log \
    --log-file-format="File changed! %f %i" \
    source-dir target-dir

if fgrep "File changed!" /tmp/rsync.log > /dev/null; then
    echo "rsync did something!"
fi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.