TL; DR
ไม่ใช่>>"โดยทั่วไปจะหาจุดสิ้นสุดของไฟล์" ในขณะที่>รักษาตัวชี้ไปยังตำแหน่งที่เขียนล่าสุด
คำตอบแบบเต็ม
(หมายเหตุ: การทดสอบทั้งหมดของฉันทำบน Debian GNU / Linux 9)
ความแตกต่างอื่น
ไม่พวกเขาไม่เทียบเท่า มีความแตกต่างอื่น มันอาจปรากฏตัวเองโดยไม่คำนึงว่าไฟล์เป้าหมายมีอยู่ก่อนหรือไม่
หากต้องการสังเกตให้เรียกใช้กระบวนการที่สร้างข้อมูลและเปลี่ยนเส้นทางไปยังไฟล์ที่มี>หรือ>>(เช่นpv -L 10k /dev/urandom > blob) ปล่อยให้มันรันและเปลี่ยนขนาดของไฟล์ (เช่นด้วยtruncate) คุณจะเห็นว่า>ยังคง (เพิ่มขึ้นเรื่อย ๆ ) ในขณะที่>>ต่อท้ายเสมอ
- หากคุณตัดไฟล์ให้มีขนาดเล็กลง (อาจเป็นขนาดศูนย์)
>จะไม่สนใจมันจะเขียนที่ออฟเซ็ตที่ต้องการราวกับว่าไม่มีอะไรเกิดขึ้น หลังจากการตัดทอนออฟเซ็ตเกินกว่าจุดสิ้นสุดของไฟล์สิ่งนี้จะทำให้ไฟล์คืนขนาดเดิมและขยายเพิ่มขึ้นข้อมูลที่หายไปจะเต็มไปด้วยเลขศูนย์
>> จะต่อท้ายใหม่ไฟล์จะขยายจากขนาดที่ถูกตัดทอน
- ถ้าคุณขยายไฟล์
>จะไม่สนใจมันจะเขียนที่ออฟเซ็ตที่ต้องการราวกับว่าไม่มีอะไรเกิดขึ้น หลังจากเปลี่ยนขนาดออฟเซ็ตแล้วจะอยู่ที่ไหนในไฟล์สิ่งนี้จะทำให้ไฟล์หยุดการเติบโตชั่วขณะจนกว่าออฟเซ็ตจะถึงจุดสิ้นสุดใหม่จากนั้นไฟล์จะเติบโตตามปกติ
>> จะผนวกกับส่วนท้ายใหม่ไฟล์จะขยายจากขนาดที่ขยายใหญ่ขึ้น
อีกตัวอย่างหนึ่งคือการผนวก (แยกต่างหาก>>) สิ่งพิเศษเมื่อกระบวนการสร้างข้อมูลกำลังทำงานและเขียนลงในไฟล์ สิ่งนี้คล้ายกับการขยายไฟล์
- กระบวนการสร้างด้วย
>จะเขียนที่ออฟเซ็ตที่ต้องการและเขียนทับข้อมูลพิเศษในที่สุด
- กระบวนการสร้างด้วย
>>จะข้ามข้อมูลใหม่และผนวกเข้ากับข้อมูลนั้น (สภาพการแข่งขันอาจเกิดขึ้นสตรีมทั้งสองอาจได้รับการอินเตอร์ลียังคงไม่ควรเขียนทับข้อมูล)
ตัวอย่าง
ในทางปฏิบัติมันมีความสำคัญอย่างไร? มีคำถามนี้ :
ฉันใช้กระบวนการที่สร้างเอาต์พุตจำนวนมากใน stdout กำลังส่งไปยังไฟล์ทั้งหมด [... ] ฉันสามารถใช้โปรแกรมการหมุนเวียนแบบบันทึกได้ไหม
คำตอบนี้บอกว่าการแก้ปัญหาอยู่logrotateกับcopytruncateตัวเลือกซึ่งทำหน้าที่ดังนี้
ตัดทอนไฟล์บันทึกดั้งเดิมหลังจากสร้างสำเนาแทนการย้ายไฟล์บันทึกเก่าและเลือกสร้างไฟล์ใหม่
ตามที่ฉันเขียนไว้ข้างต้นการเปลี่ยนเส้นทางด้วย>จะทำให้บันทึกที่ถูกตัดทอนมีขนาดใหญ่ในเวลาไม่นาน การกระจัดกระจายจะช่วยประหยัดทั้งวันไม่มีพื้นที่ว่างบนดิสก์ที่สำคัญ อย่างไรก็ตามการบันทึกต่อเนื่องแต่ละครั้งจะมีศูนย์นำหน้ามากขึ้นเรื่อย ๆ ซึ่งไม่จำเป็นอย่างสมบูรณ์
แต่ถ้าlogrotateสร้างสำเนาโดยไม่รักษาความเป็นศูนย์ศูนย์นำหน้าเหล่านี้จะต้องการพื้นที่ดิสก์มากขึ้นทุกครั้งที่ทำสำเนา ฉันไม่ได้ตรวจสอบพฤติกรรมของเครื่องมือมันอาจฉลาดพอที่จะมีการกระจายหรือการบีบอัดได้ทันที (หากเปิดใช้การบีบอัด) ศูนย์ยังอาจทำให้เกิดปัญหาหรือเป็นกลางที่ดีที่สุด; ไม่มีอะไรดีในพวกเขา
ในกรณีนี้การใช้>>แทนที่จะ>ดีกว่าอย่างมีนัยสำคัญแม้ว่าไฟล์เป้าหมายกำลังจะถูกสร้างขึ้น
ประสิทธิภาพ
อย่างที่เราเห็นผู้ให้บริการทั้งสองทำหน้าที่ต่างกันไม่เพียง แต่เมื่อพวกเขาเริ่ม แต่ในภายหลัง สิ่งนี้อาจทำให้เกิดความแตกต่างของประสิทธิภาพ (เล็กน้อย?) สำหรับตอนนี้ฉันไม่มีผลการทดสอบที่มีความหมายที่จะสนับสนุนหรือพิสูจน์หักล้าง แต่ฉันคิดว่าคุณไม่ควรถือว่าประสิทธิภาพโดยทั่วไปของพวกเขานั้นเหมือนกันโดยอัตโนมัติ
>>โดยพื้นฐานแล้ว "พยายามค้นหาจุดสิ้นสุดไฟล์เสมอ" ในขณะที่>รักษาตัวชี้ไปยังตำแหน่งที่เขียนล่าสุด ดูเหมือนว่าอาจมีความแตกต่างของประสิทธิภาพเล็กน้อยในวิธีที่พวกเขาทำงานเช่นกัน ...