อะตอม gzip หรือไม่


11

คือgzipอะตอม?

จะเกิดอะไรขึ้นถ้าฉันหยุดgzipกระบวนการในขณะที่อยู่ระหว่างการบีบอัดไฟล์

หากไม่ใช่อะตอมลีและถ้าฉันกด Ctrl + C บนgzip *.txtกระบวนการอยู่แล้วฉันจะกลับมาทำงานอย่างปลอดภัยได้อย่างไร?

(ฉันไม่เพียงแค่อยากรู้อยากเห็นเกี่ยวกับวิธีการทำงานต่อ แต่ยังเกี่ยวกับว่าgzipอะตอมเป็นพิเศษหรือไม่)



4
"ฉันจะดำเนินการต่ออย่างปลอดภัยได้อย่างไร" _ ... ใช้CTRL+ZแทนCTRL+Cแล้วฆ่าหรือทำงานต่อที่ขัดจังหวะ (ตอบด้วยหมายเลขn[- [n]+ Stopped-- gzip ...] จากนั้นคุณสามารถดำเนินการต่อด้วย%nหรือพร้อมfgหรือกับbg... ในลักษณะเดียวกัน คุณสามารถฆ่ามันด้วยkill %n)
Hastur

บีบอัดไฟล์ขนาดใหญ่ Ctrl-C ขณะกำลังบีบอัดและดูว่าเกิดอะไรขึ้น
RonJohn

ไม่ mv เท่านั้นเป็นอะตอมมิกยกเว้น ext4 … sarcasm dripping แต่อย่างน้อยพวกเขาก็คงตัวเลือกการเมาท์เริ่มต้นไว้ก่อนหน้านี้
mirabilos

คำตอบ:


28

อะตอม gzip หรือไม่

ไม่มันสร้างไฟล์บีบอัดแล้วลบต้นฉบับที่ไม่บีบอัด

มันไม่บีบอัดไฟล์ในแหล่งกำเนิดและมีช่วงเวลาหนึ่งในขณะที่ไฟล์กำลังถูกบีบอัดโดยที่

  • เป้าหมายที่บีบอัดไม่สมบูรณ์
  • ไฟล์บีบอัดบางส่วนและแหล่งที่มาทั้งสองมีอยู่ในระบบไฟล์

จะเกิดอะไรขึ้นถ้าฉันหยุดกระบวนการ gzip ขณะที่มันกำลังอยู่ระหว่างการ gzipping ไฟล์

ถ้าคุณหยุดgzipกระบวนการที่มีสัญญาณ catchable ( SIGINTจากCtrl Cตัวอย่างเช่น) มันจะทำความสะอาดบางส่วนสร้างไฟล์ มิฉะนั้นขึ้นอยู่กับจุดที่หยุดคุณอาจจบลงด้วยไฟล์บีบอัดบางส่วนพร้อมกับต้นฉบับที่ไม่ถูกแตะต้อง

หากไม่ใช่อะตอมถ้าฉันกด Ctrl + C ในกระบวนการ gzip * .txt แล้วฉันจะกลับมาทำงานได้อย่างปลอดภัยได้อย่างไร?

คุณลบรุ่นบีบอัดบางส่วน (ถ้ามันยังคงมีอยู่) gzipและรีสตาร์ท


5
ที่สองเกิดขึ้นเมื่อกระบวนการถูกยกเลิกไม่ใช่เมื่อหยุดและจะเกิดขึ้นกับสัญญาณที่ไม่ได้รับการจัดการเท่านั้น (ไม่ใช่สำหรับ ^ C -> SIGINTหรือSIGTERMสำหรับการgzipติดตั้งตัวจัดการสัญญาณซึ่งลบไฟล์เอาต์พุต)
mosvy

1
@mosvy ดังนั้นมันจึงเป็นเช่นนั้น ฉันไม่เคยเห็นแบบนั้นมาก่อน ขอบคุณ
roaima

1
คุณใช้ความระมัดระวังเป็นอย่างยิ่งเพื่อให้มั่นใจว่าคุณจะไม่ลบไฟล์ gzipped ใด ๆ เนื่องจากไฟล์ต้นฉบับนั้นถูกลบไปแล้ว เมื่อ gzip ถูกฆ่าอย่างไม่สม่ำเสมอนั่นคือโดยปกติจะเป็นหนึ่งไฟล์โดยปกติจะเป็นไฟล์สุดท้าย
Harper - Reinstate Monica

@Harper ใช่ หากคุณหยุดgzipการไหลกลางมีสภาพการแข่งขันเล็ก ๆ ที่นั่นเสมอ หรือคุณสามารถบอกได้gzipตลอดเวลาว่าจะเขียนทับไฟล์เป้าหมายซึ่งอยู่ด้านข้างของปัญหาการล้างข้อมูลส่วนใหญ่
roaima

15

มันไม่ได้เป็นอะตอม (ระบบแฟ้ม API Unix ไม่ได้จริงๆให้วิธีการในการดำเนินการของอะตอมที่มีผลต่อหลายไฟล์ใด ๆ ) แต่มันเป็นไม่ปลอดภัย ไฟล์บีบอัดเป็นไฟล์ใหม่ไม่เขียนทับไฟล์ต้นฉบับและไม่ลบไฟล์ต้นฉบับจนกว่าจะสร้างไฟล์บีบอัดให้เสร็จ (ซึ่งอาจทำให้เกิดปัญหาได้หากคุณมีพื้นที่ว่างในดิสก์ไม่เพียงพอสำหรับ ทั้งไฟล์)

หากได้รับข้อผิดพลาดหรือคุณขัดจังหวะการบีบอัดไฟล์ต้นฉบับจะยังคงไม่เปลี่ยนแปลง ไฟล์บีบอัดบางส่วนมักจะถูกลบออก

ไม่มีวิธีการดำเนินการต่อที่ตรงกลางคุณเพิ่งเริ่มต้นใหม่ตั้งแต่ต้น


นี่ทำให้ฉันคิดได้ว่าจะมีการใช้งานการประมวลผลแบบหลายอะตอมได้อย่างไร คล้ายธุรกรรม SQL
พูดว่า Reinstate Monica

1
@val ประมาณ 30 ปีที่แล้วฉันอยู่ในทีมที่ออกแบบระบบปฏิบัติการใหม่เป็น Multic / GCOS followon และระบบไฟล์ที่เหมือนฐานข้อมูลเป็นส่วนหนึ่งของความคิด แม้ว่าโครงการจะไม่ไกลนัก
Barmar

พวกเขาลบธุรกรรม NTFS ดูเหมือนว่าจะไม่คุ้มค่ากับความซับซ้อน การเปลี่ยนชื่อเป็นการดำเนินการแบบอะตอมมิกส่วนใหญ่ (ตราบใดที่คุณอยู่ในระบบไฟล์เดียวกันและมีความหมาย posix) ดังนั้นการเปลี่ยนชื่อ (หลังจากปิด / fsync) จาก temp เป็นชื่อสุดท้ายจะทำให้มั่นใจได้ว่าไฟล์ที่ไม่มีการบีบอัด คุณสามารถหลีกเลี่ยงปัญหาเหล่านั้นด้วยการใช้ท่อ (ซึ่งมีโหมดความล้มเหลวบางส่วนของตัวเอง)
Eckes

@eck ตราบใดที่ลบต้นฉบับหลังจากปิดไฟล์บีบอัดคุณไม่จำเป็นต้องเปลี่ยนชื่ออะตอมมิก หากต้นฉบับหายไปคุณสามารถมั่นใจได้ว่าไฟล์บีบอัดนั้นสมบูรณ์ คุณต้องเปลี่ยนชื่ออะตอมมิกสำหรับการดำเนินการที่แทนที่ไฟล์ดั้งเดิม (เช่นsed -i)
Barmar

@Barmar หากคุณต้องการทริกเกอร์โดยการมีอยู่ของไฟล์เป้าหมาย (ซึ่งเวิร์กโฟลว์การทำโพลหลายไดเรกทอรีทำ) คุณควรแน่ใจว่าไฟล์นั้นสมบูรณ์แล้ว หากคุณไม่ทริกเกอร์หรือตรวจพบไฟล์ที่ไม่สมบูรณ์โดยการตรวจสอบว่ามีแหล่งข้อมูลอยู่แสดงว่าคุณใช้ได้โดยไม่ต้องเปลี่ยนชื่อขั้นสุดท้าย
eckes

4

คุณไม่จำเป็นต้องกังวลเกี่ยวกับสิ่งนั้นเพราะgzipสร้าง.gzไฟล์ใหม่เติมด้วยเนื้อหาที่บีบอัดแล้วลบไฟล์ต้นฉบับ ดังนั้นหากคุณหยุดกระบวนการที่อยู่ตรงกลางมันจะไม่ส่งผลกระทบต่อไฟล์ต้นฉบับของคุณ


3

.txtไฟล์ที่ประมวลผลเรียบร้อยแล้วโดยgzipจะถูกแทนที่ด้วย.txt.gzไฟล์บีบอัดเพื่อให้คุณสามารถทำงานได้อย่างปลอดภัยgzip *.txtอีกครั้งเฉพาะไฟล์ที่ยังไม่ได้ประมวลผลเท่านั้นที่จะถูกบีบอัด

แฟ้มที่ถูกประมวลผลโดย gzip ในเวลาที่คุณกด Ctrl-C จะไม่แปร - gzip จะไม่แทนที่มันจนกว่าหลังจากที่ประสบความสำเร็จในการบีบอัดมัน


0

ไม่มันเป็นเรื่องที่น่าเบื่อหน่าย สิ่งนี้จะทำให้คุณประสบปัญหาอย่างมากหากคุณ gzip ไฟล์ที่ต่อท้ายเช่นเว็บล็อก

Gzip อ่านสร้างไฟล์. gz (ด้วยการประทับเวลาปัจจุบัน) คัดลอกการประทับเวลาของไฟล์ดั้งเดิมจากนั้นลบต้นฉบับ

การขัดจังหวะบางอย่างอาจทำให้หลงทาง.txt.gzไฟล์ที่ยังไม่เสร็จติดกับ.txtไฟล์ สิ่งนี้จะสร้างปัญหาเรื่องความถูกต้องของข้อมูล: ไฟล์ใดเป็นไฟล์จริง นี่คือ

  • gzip ซึ่งล้มเหลวทำให้เกิดข้อผิดพลาด / ไม่สมบูรณ์.txt.gzหรือไม่ หรือ
  • gunzip ซึ่งล้มเหลวปล่อย.txtไฟล์ไม่สมบูรณ์ / ถูกตัดทอนหรือไม่? หรือ
  • ไฟล์ gzipped เป็นสำเร็จ txt.gzและไฟล์ที่สร้างขึ้นใหม่ .txt ?

(สิ่งนี้จะเกิดขึ้นเมื่อคุณเข้าสู่ไดเรกทอรีบันทึก HTTP ของคุณและไปgzip *)

ฉันมักจะพบว่ามันรอบคอบในการจัดเรียงสิ่งนี้ด้วยมือเว้นแต่คุณจะรู้ว่าเกิดอะไรขึ้นเพราะคุณเพิ่งทำ

โชคดีที่ gzip ทำงานตามปกติดังนั้นคุณควรมีปัญหากับไฟล์เดียว การขนาน gzip ไม่ใช่ความคิดที่ดี - แม้ว่ามันจะใช้ CPU อย่างเต็มที่มากขึ้น แต่มันจะฟาดดิสก์ที่บังคับให้อ่านไฟล์หลาย ๆ ไฟล์ในครั้งเดียวทำให้ gzip ทั้งหมดช้าลงอย่างมาก SSD หรือ RAMdisk ตรงกันข้าม ...


1
@roaima เราทำจริง ๆ ฉันใช้คำสแลงที่เราเคยใช้เมื่อนานมาแล้วในที่เดียวที่ฉันทำงาน การแก้ไขคำจำกัดความทั่วไป
Harper - Reinstate Monica

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