f +++++++++ ในบันทึก rsync หมายถึงอะไร


117

ฉันใช้rsyncเพื่อสำรองไฟล์เซิร์ฟเวอร์ของฉันและฉันมีคำถามสองข้อ:

  1. ในระหว่างกระบวนการฉันต้องหยุดและเริ่มrsyncใหม่อีกครั้ง
    จะrsyncเริ่มจากจุดที่หยุดหรือจะรีสตาร์ทจากจุดเริ่มต้น?

  2. "f+++++++++"ในแฟ้มบันทึกที่ฉันเห็น หมายความว่าอย่างไร?

เช่น:

2010/12/21 08:28:37 [4537] >f.st...... iddd/logs/website-production-access_log
2010/12/21 08:29:11 [4537] >f.st...... iddd/web/website/production/shared/log/production.log
2010/12/21 08:29:14 [4537] .d..t...... iddd/web/website/production/shared/sessions/
2010/12/21 08:29:14 [4537] >f+++++++++ iddd/web/website/production/shared/sessions/ruby_sess.017a771cc19b18cd
2010/12/21 08:29:14 [4537] >f+++++++++ iddd/web/website/production/shared/sessions/ruby_sess.01eade9d317ca79a

คำตอบ:


198

มาดูกันว่า rsync ทำงานอย่างไรและทำความเข้าใจกับบรรทัดผลลัพธ์ที่เป็นความลับ:

1 - ข้อได้เปรียบอย่างมากของ rsync คือหลังจากหยุดชะงักในครั้งต่อไปมันจะดำเนินต่อไปอย่างราบรื่น

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

2 - อักขระแต่ละตัวเป็นรหัสที่สามารถแปลได้หากคุณอ่านหัวข้อ-i, --itemize-changesในman rsync

การถอดรหัสไฟล์บันทึกตัวอย่างของคุณจากคำถาม:

> f.st ......

> - the item is received
f - it is a regular file
s - the file size is different
t - the time stamp is different

.d..t ......

. - the item is not being updated (though it might have attributes 
    that are being modified)
d - it is a directory
t - the time stamp is different

> ฉ +++++++++

> - the item is received
f - a regular file
+++++++++ - this is a newly created item

ส่วนที่เกี่ยวข้องของหน้า rsync man:

-i, --itemize- การเปลี่ยนแปลง

ขอรายการแบบแยกย่อยของการเปลี่ยนแปลงที่เกิดขึ้นกับแต่ละไฟล์รวมถึงการเปลี่ยนแปลงแอ็ตทริบิวต์ สิ่งนี้เหมือนกับการระบุ --out-format = '% i% n% L' หากคุณทำซ้ำตัวเลือกนี้ไฟล์ที่ไม่เปลี่ยนแปลงจะถูกส่งออกเช่นกัน แต่ถ้า rsync ที่รับเป็นอย่างน้อยเวอร์ชัน 2.6.7 (คุณสามารถใช้ -vv กับ rsync เวอร์ชันเก่าได้ แต่จะเปิดเอาต์พุตของ verbose mes อื่น ๆ ด้วย ปราชญ์)

Escape "% i" มีเอาต์พุตที่เป็นความลับซึ่งมีความยาว 11 ตัวอักษร รูปแบบทั่วไปจะเหมือนกับสตริง YXcstpoguax โดยที่ Y จะถูกแทนที่ด้วยประเภทของการอัปเดตที่กำลังดำเนินการ X จะถูกแทนที่ด้วยประเภทไฟล์และตัวอักษรอื่น ๆ แสดงถึงแอ็ตทริบิวต์ที่อาจเป็นเอาต์พุตหากมีการแก้ไข

ประเภทการอัปเดตที่แทนที่ Y มีดังนี้:

  • A <หมายความว่าไฟล์กำลังถูกโอนไปยังโฮสต์ระยะไกล (ส่ง)
  • A >หมายความว่าไฟล์กำลังถูกโอนไปยังโลคัลโฮสต์ (ได้รับ)
  • A cหมายถึงการเปลี่ยนแปลง / การสร้างโลคัลกำลังเกิดขึ้นสำหรับไอเท็ม (เช่นการสร้างไดเร็กทอรีหรือการเปลี่ยน symlink เป็นต้น)
  • A hหมายความว่ารายการนั้นเป็นฮาร์ดลิงก์ไปยังรายการอื่น (ต้องใช้ - ฮาร์ดลิงก์)
  • A .หมายความว่ารายการไม่ได้รับการอัปเดต (แม้ว่าอาจมีแอตทริบิวต์ที่กำลังแก้ไข)
  • A *หมายความว่าส่วนที่เหลือของพื้นที่แสดงรายการ - เอาต์พุตมีข้อความ (เช่น "การลบ")

ประเภทไฟล์ที่แทนที่ X คือ: fสำหรับไฟล์, dสำหรับไดเร็กทอรี, Lสำหรับ symlink, Dสำหรับอุปกรณ์และSสำหรับไฟล์พิเศษ (เช่นชื่อซ็อกเก็ตและฟีฟ่า)

ตัวอักษรอื่น ๆ ในสตริงด้านบนเป็นตัวอักษรจริงที่จะแสดงหากมีการอัปเดตแอตทริบิวต์ที่เกี่ยวข้องสำหรับรายการหรือ "." ไม่มีการเปลี่ยนแปลง ข้อยกเว้นสามประการ ได้แก่ (1) รายการที่สร้างขึ้นใหม่แทนที่ตัวอักษรแต่ละตัวด้วย "+" (2) รายการที่เหมือนกันจะแทนที่จุดด้วยช่องว่างและ (3) แอตทริบิวต์ที่ไม่รู้จักแทนที่ตัวอักษรแต่ละตัวด้วย "?" (สิ่งนี้สามารถเกิดขึ้นได้เมื่อพูดคุยกับ rsync ที่เก่ากว่า)

แอตทริบิวต์ที่เชื่อมโยงกับตัวอักษรแต่ละตัวมีดังนี้:

  • A cหมายถึงว่าไฟล์ปกติมีการตรวจสอบที่แตกต่างกัน (ต้องใช้ --checksum) หรือลิงก์สัญลักษณ์อุปกรณ์หรือไฟล์พิเศษมีค่าที่เปลี่ยนแปลง โปรดทราบว่าหากคุณกำลังส่งไฟล์ไปยัง rsync ก่อน 3.0.1 แฟล็กการเปลี่ยนแปลงนี้จะแสดงเฉพาะสำหรับไฟล์ทั่วไปที่แตกต่างกัน
  • A sหมายถึงขนาดของไฟล์ปกติแตกต่างกันและจะได้รับการอัปเดตโดยการถ่ายโอนไฟล์
  • A tหมายถึงเวลาในการแก้ไขแตกต่างกันและกำลังอัปเดตเป็นค่าของผู้ส่ง (ต้องใช้ - เวลา) ค่าทางเลือกของ T หมายความว่าเวลาแก้ไขจะถูกตั้งค่าเป็นเวลาในการถ่ายโอนซึ่งจะเกิดขึ้นเมื่อไฟล์ / symlink / อุปกรณ์ได้รับการอัปเดตโดยไม่มี - เวลาและเมื่อมีการเปลี่ยนแปลง symlink และผู้รับไม่สามารถตั้งเวลาได้ (หมายเหตุ: เมื่อใช้ไคลเอ็นต์ rsync 3.0.0 คุณอาจเห็นแฟล็ก s รวมกับ t แทนที่จะเป็นแฟล็ก T ที่เหมาะสมสำหรับความล้มเหลวในการตั้งค่าเวลานี้)
  • A pหมายถึงสิทธิ์ที่แตกต่างกันและกำลังอัปเดตเป็นค่าของผู้ส่ง (ต้องใช้ --perms)
  • oวิธีการใช้ที่แตกต่างกันและมีการปรับปรุงเพื่อให้มีค่าของผู้ส่ง (ต้อง --owner และสิทธิพิเศษใช้ super)
  • A gหมายถึงกลุ่มที่แตกต่างกันและกำลังได้รับการอัปเดตเป็นค่าของผู้ส่ง (ต้องใช้ - กลุ่มและผู้มีอำนาจในการตั้งค่ากลุ่ม)
  • uสล็อตสงวนไว้สำหรับการใช้งานในอนาคต
  • aหมายความว่าข้อมูล ACL เปลี่ยนแปลง
  • xหมายความว่าข้อมูลแอตทริบิวต์การขยายการเปลี่ยนแปลง

เป็นไปได้อีกหนึ่งเอาต์พุต: เมื่อลบไฟล์ "% i" จะส่งออกสตริง "* การลบ" สำหรับแต่ละรายการที่กำลังถูกลบ (สมมติว่าคุณกำลังพูดคุยกับ rsync ล่าสุดที่เพียงพอที่จะบันทึกการลบแทนที่จะส่งออกเป็น ข้อความ verbose)


โพสต์ / คำตอบนี้เก่ามากแล้ว แต่ฉันต้องเขียนความคิดเห็นเกี่ยวกับเรื่องนี้ เป็นหนึ่งในคำตอบที่ดีที่สุดที่ฉันเคยเห็นเกี่ยวกับ rsync ขอบคุณ mit
Jorge

102

ในบางครั้งฉันต้องเข้าใจrsyncผลลัพธ์ของสคริปต์ที่ฉันเขียน ในระหว่างขั้นตอนของการเขียนสคริปต์ที่ฉัน googled รอบและมาถึงสิ่งที่ @mit ได้เขียนข้างต้น ฉันใช้ข้อมูลดังกล่าวตลอดจนเอกสารประกอบจากแหล่งอื่นเพื่อสร้างไพรเมอร์ของฉันเองบนแฟล็กบิตและวิธีรับrsyncแฟล็กบิตเอาต์พุตสำหรับการกระทำทั้งหมด (ไม่ได้ทำตามค่าเริ่มต้น)

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

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

คำอธิบายของแต่ละตำแหน่งบิตและค่าในrsyncเอาต์พุต:

YXcstpoguax  path/to/file
|||||||||||
||||||||||╰- x: The extended attribute information changed
|||||||||╰-- a: The ACL information changed
||||||||╰--- u: The u slot is reserved for future use
|||||||╰---- g: Group is different
||||||╰----- o: Owner is different
|||||╰------ p: Permission are different
||||╰------- t: Modification time is different
|||╰-------- s: Size is different
||╰--------- c: Different checksum (for regular files), or
||              changed value (for symlinks, devices, and special files)
|╰---------- the file type:
|            f: for a file,
|            d: for a directory,
|            L: for a symlink,
|            D: for a device,
|            S: for a special file (e.g. named sockets and fifos)
╰----------- the type of update being done::
             <: file is being transferred to the remote host (sent)
             >: file is being transferred to the local host (received)
             c: local change/creation for the item, such as:
                - the creation of a directory
                - the changing of a symlink,
                - etc.
             h: the item is a hard link to another item (requires 
                --hard-links).
             .: the item is not being updated (though it might have
                attributes that are being modified)
             *: means that the rest of the itemized-output area contains
                a message (e.g. "deleting")

ตัวอย่างผลลัพธ์บางส่วนจาก rsync สำหรับสถานการณ์ต่างๆ:

>f+++++++++ some/dir/new-file.txt
.f....og..x some/dir/existing-file-with-changed-owner-and-group.txt
.f........x some/dir/existing-file-with-changed-unnamed-attribute.txt
>f...p....x some/dir/existing-file-with-changed-permissions.txt
>f..t..g..x some/dir/existing-file-with-changed-time-and-group.txt
>f.s......x some/dir/existing-file-with-changed-size.txt
>f.st.....x some/dir/existing-file-with-changed-size-and-time-stamp.txt 
cd+++++++++ some/dir/new-directory/
.d....og... some/dir/existing-directory-with-changed-owner-and-group/
.d..t...... some/dir/existing-directory-with-different-time-stamp/

การบันทึกrsyncเอาต์พุต (เน้นที่แฟล็กบิต):

ในการทดลองของฉันทั้ง--itemize-changesธงและ-vvvธงที่มีความจำเป็นที่จะได้รับrsyncการส่งออกรายการสำหรับทุกการเปลี่ยนแปลงระบบไฟล์ หากไม่มี-vvvแฟล็ก triple verbose ( ) ฉันไม่เห็นไดเร็กทอรีลิงก์และการเปลี่ยนแปลงอุปกรณ์ในรายการ ควรทดลองกับ rsync เวอร์ชันของคุณเพื่อให้แน่ใจว่ามีการสังเกตและสังเกตทุกสิ่งที่คุณคาดหวัง

การใช้เทคนิคนี้อย่างมีประโยชน์อย่างหนึ่งคือการเพิ่ม--dry-runแฟล็กลงในคำสั่งและรวบรวมรายการการเปลี่ยนแปลงตามที่กำหนดโดย rsync ลงในตัวแปร (โดยไม่ต้องทำการเปลี่ยนแปลงใด ๆ ) เพื่อให้คุณสามารถดำเนินการบางอย่างในรายการได้ด้วยตัวเอง สิ่งต่อไปนี้จะจับผลลัพธ์ในตัวแปร:

file_system_changes=$(rsync --archive --acls --xattrs \
    --checksum --dry-run \
    --itemize-changes -vvv \
    "/some/source-path/" \
    "/some/destination-path/" \
| grep -E '^(\.|>|<|c|h|\*).......... .')

ในตัวอย่างด้านบนเอาต์พุต (stdout) จากrsyncถูกเปลี่ยนเส้นทางไปยังgrep(ผ่าน stdin) ดังนั้นเราจึงสามารถแยกเฉพาะบรรทัดที่มีแฟล็กบิต

การประมวลผลเอาต์พุตที่จับได้:

จากนั้นสามารถบันทึกเนื้อหาของตัวแปรเพื่อใช้ในภายหลังหรือทำซ้ำได้ทันทีสำหรับรายการที่น่าสนใจ rsyncฉันจะใช้กลยุทธ์นี้แน่นอนในสคริปต์ที่ผมเขียนในระหว่างการวิจัยเพิ่มเติมเกี่ยวกับ คุณสามารถดูสคริปต์ ( https://github.com/jmmitchell/movestough ) สำหรับตัวอย่างของการประมวลผลหลังการประมวลผลเอาต์พุตที่จับเพื่อแยกไฟล์ใหม่ไฟล์ที่ซ้ำกัน (ชื่อเดียวกันเนื้อหาเดียวกัน) การชนกันของไฟล์ (ชื่อเดียวกันต่างกัน เนื้อหา) ตลอดจนการเปลี่ยนแปลงโครงสร้างไดเร็กทอรีย่อย


1
มีประโยชน์มาก! -T ในเอาต์พุตบันทึกคืออะไร
Pol Hallen

Pol คุณกำลังถามเกี่ยวกับ - T แฟล็กสำหรับ rsync หรือไม่?
John Mark Mitchell

Pol ถ้าฉันเข้าใจคำถามของคุณถูกต้อง t ในบันทึก rsync หมายความว่าทั้งสองไฟล์ที่เปรียบเทียบกันมีการประทับเวลาที่แตกต่างกัน ความหมายถูกสร้างขึ้นหรือแก้ไขในเวลาที่ต่างกัน
John Mark Mitchell

3
ฉันเชื่อว่า "T" ในเอาต์พุตหมายถึงเวลาที่อัปเดตเป็นเวลาปัจจุบัน "<f..T ...... Rise.mp3" อย่างน้อยนี่คือสิ่งที่ฉันสังเกตเห็น "t" จะเป็นเวลาของไฟล์ในเครื่อง
ซีเคลลี่

1
ฉันช้าไปสองสามปี แต่มีการอธิบาย "t" vs "T" ใน man page: A t หมายถึงเวลาในการแก้ไขแตกต่างกันและกำลังอัปเดตเป็นค่าของผู้ส่ง (ต้องใช้ - ครั้ง) ค่าทางเลือกของ T หมายความว่าเวลาแก้ไขจะถูกตั้งค่าเป็นเวลาในการถ่ายโอนซึ่งจะเกิดขึ้นเมื่อไฟล์ / symlink / อุปกรณ์ได้รับการอัปเดตโดยไม่มี - เวลาและเมื่อมีการเปลี่ยนแปลง symlink และผู้รับไม่สามารถตั้งเวลาได้ (หมายเหตุ: เมื่อใช้ไคลเอนต์ rsync 3.0.0 คุณอาจเห็นแฟ
ล็ก

2

1) Wodin นั่นไม่เป็นความจริงเลย หากใช้ --partial หรือ -P tag (เหมือนกับ --partial --progress) rsync จะดำเนินการถ่ายโอนที่ถูกขัดจังหวะ

2) นั่นคือผลลัพธ์ทั่วไปสำหรับแท็ก --itemize-changes


2

1. ) มันจะ "เริ่มการซิงค์ใหม่" แต่จะไม่ถ่ายโอนไฟล์ที่มีขนาดและการประทับเวลาเดียวกันเป็นต้นขั้นแรกจะสร้างรายการไฟล์ที่จะถ่ายโอนและในขั้นตอนนี้จะเห็นว่ามีการโอนไฟล์บางไฟล์แล้ว และจะข้ามไป คุณควรบอก rsync เพื่อรักษาการประทับเวลาเป็นต้น (เช่นใช้rsync -a ...)

ในขณะที่ rsync กำลังโอนไฟล์มันจะเรียกมันว่า.filename.XYZABCแทนที่จะเป็นไฟล์filename. จากนั้นเมื่อโอนไฟล์เสร็จแล้วก็จะเปลี่ยนชื่อใหม่ ดังนั้นหากคุณฆ่า rsync ในขณะที่กำลังถ่ายโอนไฟล์ขนาดใหญ่คุณจะต้องใช้ตัวเลือก --partial เพื่อดำเนินการถ่ายโอนต่อแทนที่จะเริ่มจากศูนย์

2. ) ฉันไม่รู้ว่ามันคืออะไร แปะตัวอย่างหน่อยได้ไหม

แก้ไข: ตามhttp://ubuntuforums.org/showthread.php?t=1342171รหัสเหล่านั้นถูกกำหนดไว้ในหน้าคน rsync ในส่วนสำหรับ-i, --itemize-changesตัวเลือก

แก้ไขส่วนถ้าคำตอบของฉันอิงจาก Joao's


ฉันใส่ตัวอย่างบันทึกไว้ด้านบน ขอบคุณ
GodFather

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