tar: การออกจากสถานะความล้มเหลวเนื่องจากข้อผิดพลาดก่อนหน้า


78

ฉันได้เขียนสคริปต์เล็กน้อยที่จะตรวจสอบและบีบอัดรายการไดเรกทอรี + ไฟล์

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

อย่างไรก็ตามฉันได้รับข้อความที่น่ารำคาญหลังจากสคริปต์เสร็จสิ้น:

tar: การออกจากสถานะความล้มเหลวเนื่องจากข้อผิดพลาดก่อนหน้า

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

อะไรคือสาเหตุที่เป็นไปได้ที่ข้อความข้อผิดพลาด / คำเตือนนี้ถูกสร้างขึ้น - และฉันสามารถเพิกเฉยได้อย่างปลอดภัยหรือไม่? หากฉันไม่สามารถเพิกเฉยมันขั้นตอนในการวินิจฉัยและแก้ไขข้อผิดพลาดคืออะไร?

ฉันกำลังใช้งาน Ubuntu 10.0.4

คำตอบ:


100

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


8
+1 สำหรับคำแนะนำ (ฉันใช้ตัวเลือก 'verbose' ก่อนหน้านี้) ฉันพบว่ามีปัญหาสิทธิ์ในไฟล์อย่างน้อยหนึ่งไฟล์ อย่างน้อยตอนนี้ฉันรู้วิธีแก้ไขปัญหานี้ ขอบคุณมาก
morpheous

ใช่ใช้ sudo แก้ไขปัญหา
วิสต์

การใช้แฟล็ก -v เป็นคำแนะนำที่ดีและช่วยฉันแก้ปัญหาของฉัน 'verbose' ปิดบังสาเหตุของความล้มเหลวหลังกำแพงข้อความ
scottyseus

22

ปัญหาคือการโต้แย้ง, การ fโต้แย้งจะใช้เวลาต่อไปเป็นชื่อไฟล์ดังนั้นมันจะต้องเป็นครั้งสุดท้ายของการโต้แย้ง

tar cvzf output.tgz folder

หรือ

tar -cvzf output.tgz folder

เหมือนกันและไม่มีข้อผิดพลาด


แก้ไขปัญหาของฉัน ฉันพยายาม tar -zcvfp ให้ข้อผิดพลาด แต่เมื่อลอง tar -zxvpf แล้วก็ไม่เป็นไร ขอบคุณ
Mian Asbat Ahmad

6

บางครั้งการสำรองไฟล์ที่อาจมีการเปลี่ยนแปลงในระหว่างการสำรองข้อมูลเช่น logfiles คุณอาจพบว่ามีประโยชน์กับตัวเลือก tar '--ignore-failed-read-read' (ฉันใช้ Debian Linux ไม่แน่ใจว่าไม่ใช่ gnu tar)

เอาต์พุตมาตรฐานและข้อผิดพลาดสามารถเปลี่ยนเส้นทางใน 2 ไฟล์ที่แตกต่างกันดังนี้:

LOGDIR='/var/log/mylogdir' 
LOG=${LOGDIR}/backup.log 
ERRLOG=${LOGDIR}/backup.error.log 
DATE=$(date +%Y-%m-%d)
HOSTNAME=$(hostname)
DATA_DIRS='/etc /home /root'

tar --ignore-failed-read -f ${BACKUP_DIR}/${HOSTNAME}-${DATE}.tgz -cvz ${DATA_DIRS} > $LOG 2> $ERRLOG

ฉันคิดว่ามันปลอดภัยโดยทั่วไป แต่โปรดระวังด้วยว่า tar จะไม่หยุด ...


5

ฉันมีปัญหาเดียวกันและไม่มีคำตอบข้างต้นทำงานให้ฉัน อย่างไรก็ตามฉันพบว่าการรันคำสั่งต่อไปนี้ใช้ได้:

tar -cpzf /backups/fullbackup.tar.gz --exclude=backups --exclude=proc --exclude=tmp --exclude=mnt --exclude=sys --exclude=dev --exclude=run /

ข้อผิดพลาดที่ถูกอ้างถึงในtar: Exiting with failure status due to previous errorsสามารถระบุได้โดยการปิดตัวเลือก -v จากการตรวจสอบข้อผิดพลาดมาจากไดเรกทอรีเช่นและ/run/sys

โดยการยกเว้นไดเรกทอรีเหล่านี้มันทำงานได้ดี หวังว่านี่จะช่วยทุกคนที่มีปัญหาคล้ายกัน


3

ฉันมีปัญหาเดียวกัน. สิ่งที่ฉันทำคือการลบเครื่องหมายขีดกลาง ("-") ออกจากคำสั่ง

แทนที่จะพิมพ์เป็น

tar -cvfz โฟลเดอร์ output.tar.gz /

ลองพิมพ์เป็น

tar cvfz โฟลเดอร์ output.tar.gz /

ฉันไม่ทราบสาเหตุที่ทำให้เกิดปัญหาในกรณีของฉัน แต่อย่างน้อยก็ทำงานได้


6
คุณอาจทดสอบกับ GNU tar ความสับสนของคุณมาจากความจริงที่ว่ามันยอมรับสไตล์ที่แตกต่างกันสองตัวเลือก - ตัวเลือก tar "แบบเก่า" ที่ไม่มีเส้นประและตัวเลือก "unix มาตรฐาน" พร้อมกับเส้นประ ตัวเลือกที่มีเส้นประต้องการอาร์กิวเมนต์ของตัวเลือกที่จะทำตามตัวเลือก ดังนั้นในกรณีนี้-fควรมีการโต้แย้งoutput.tar.gzและจะต้องไม่อยู่zในระหว่าง หากไม่มีการเรียงลำดับตัวเลือกใหม่จะเป็น: tar -cvf output.tar.gz -z folder/. รูปแบบเก่าคาดหวังว่าตัวเลือกทั้งหมดในที่เดียวและข้อโต้แย้งทั้งหมดเป็นไปตาม
pabouk

ดูเอกสาร tar GNUและสำหรับตัวอย่างTru64 UNIX หน้าคนน้ำมันดิน
pabouk

@pabouk ความคิดเห็นนั้นดูจะคุ้มค่าที่จะเป็นคำตอบของตัวเอง โปรดเพิ่มเนื้อหาของความคิดเห็นนั้นเป็นคำตอบสำหรับคำถามนี้เพื่อเครดิตจะไปยังที่ที่ครบกำหนดเครดิต
cwallenpoole

ฉันยังมีปัญหา แต่มันเป็นไฟล์ที่มีชื่อ -v ดังนั้น tar มีข้อบกพร่องบางอย่างเกี่ยวกับไฟล์ที่สามารถสำรองข้อมูล ... นี่ไม่ควรเป็นปัญหา วิธีแก้ปัญหาของฉันตั้งแต่ rm และ mv ไม่ทำงานคือใช้ตัวจัดการไฟล์ เห็นได้ชัดว่า mv และ rm ก็มีรถด้วยเช่นกัน ฉันลอง mv '-v' v และ rm '-v' แต่ได้รับข้อความแสดงข้อผิดพลาด tar กล่าวถึงมันไม่สามารถสร้างไฟล์ tar ได้ ใช้ -cfjv
Jim Michaels

1

คุณเข้าใจผิดคำตอบก่อนหน้านี้ ปัญหาไม่-ได้เป็นที่ที่fอยู่ในรายการอาร์กิวเมนต์ของคุณ

tar cvfz target.tgz <files>

จะพยายามสร้างที่เก็บถาวรชื่อ "z" ตามที่เป็นข้อความหลังจากfนั้น ข้อความแสดงข้อผิดพลาดเป็นเพราะ tar ไม่สามารถหา "target.gz" เพื่อเพิ่มลงในไฟล์เก็บถาวร "z"

tar cvzf target.tgz <files>

จะสร้าง target.tgz อย่างถูกต้องและเพิ่มไฟล์เข้าไป นี่เป็นเพราะ target.tgz เป็นข้อความแรกหลังการfโต้แย้ง


ควรเพิ่มเป็นความคิดเห็นในการตอบกลับ "สับสน" น่าเสียดายที่คุณจะได้รับอนุญาตให้เพิ่มความคิดเห็นดังกล่าวหลังจากได้รับคะแนน 50 คะแนนเท่านั้น ถึงหัวข้อ:คุณทดสอบแล้วหรือยัง ฉันทดสอบกับ GNU tar 1.26 และตัวแปรที่มีและไม่มีเส้นประนั้นแตกต่างกันตามที่อธิบายไว้ในคำตอบของแจ็ค มันจะทำงานตามที่เขียนไว้ในคำตอบ
pabouk

0

โดยปกติคุณสามารถละเว้นข้อความนั้นได้ หากมีการเปลี่ยนแปลงใด ๆ (เช่นการลบไฟล์ / การสร้าง / การแก้ไข) ไปยังทรีไดเรกทอรีพื้นฐานในระหว่างการสร้าง tar มันจะส่งข้อความนั้น นอกจากนี้หากมีไฟล์พิเศษเช่นโหนดอุปกรณ์ Fifos เป็นต้นพวกเขาจะทำให้เกิดคำเตือนนั้น

แน่ใจหรือไม่ว่าคุณไม่เห็นไฟล์ผู้ร้าย ลองด้วยtar cvfz yourtarball.tgz /your/path


0

ฉันมีปัญหาที่คล้ายกันซึ่งไม่ได้รับไฟล์ที่ฉันได้รับ ปรากฎว่าฉันไม่ได้รับอนุญาตให้เขียนไฟล์ในไฟล์เก็บถาวรที่เป็นของรูท การใช้ sudo แก้ไข


0

หนึ่งในเหตุผลที่จะได้รับข้อผิดพลาดนี้สำหรับผู้เริ่มต้นคือ
พวกเขาลืมที่จะทำการดำเนินการในไดเรกทอรีที่มีไฟล์อยู่
ไปที่ตำแหน่งนั้นและดำเนินการคำสั่ง 
เนื่องจากไฟล์ของฉันอยู่ในเดสก์ท็อป 
~ / Desktop # tar - cf done.tar abc xyz
โดยที่ xyz และ abc เป็นไฟล์และเราเก็บไฟล์เหล่านั้นไว้ใน done.tar
หากเราไปและดำเนินการคำสั่งในตำแหน่งอื่นเราจะได้รับข้อผิดพลาดดังกล่าวข้างต้น 

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