Score:0

สคริปต์ Bash rsync จะไม่เสร็จสมบูรณ์ในการสำรองข้อมูลขนาดใหญ่

ธง us

ในช่วงปีที่แล้วฉันพยายามเรียนรู้การเขียนสคริปต์ทุบตีบน Ubuntu (กล่อง LTS 20.04 หนึ่งกล่องและ 21.04 หนึ่งกล่อง) ฉันรู้สึกว่าทักษะของฉันก้าวหน้าไปมาก แต่ฉันก็หมดปัญญากับสคริปต์สำรองที่ฉันเขียนไว้

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

ฉันไม่รู้ว่าฉันพลาดอะไรไป แต่ฉันกระตือรือร้นที่จะเรียนรู้ ถ้าใครสามารถช่วยฉันได้

ฉันไม่รู้ว่ามันจะช่วยได้ไหม แต่นี่คือสคริปต์ของฉันในเวอร์ชันที่ง่ายขึ้นเล็กน้อย:

#!/bin/bash
#
#ตัวสำรอง
# รวมโฟลเดอร์สำรอง บ้าน และ/หรือรูทเพื่อโจมตี Betty
# ทำงานทุกวันจาก sudo crontab (เวลาแตกต่างกันไปตามอุปกรณ์); วันของเดือนจะเป็นตัวกำหนดว่าจะทำการสำรองข้อมูลใด
#
# ไฟล์ที่เกี่ยวข้อง
# สร้าง backup.log ในโฮมโฟลเดอร์ของผู้ใช้หลัก เก็บถาวร backup.log ที่มีอยู่ไปยังโฟลเดอร์บันทึกเป็น yyyy-mm-dd-backup.log
# ต้องการสองไฟล์ใน $homefold: home-backup.exclude และ boot-backup.exclude เพื่อให้การยกเว้นการสำรองข้อมูลสำหรับ rsync
#
#ทางออกกับดัก
ฟังก์ชันปิดการทำงาน {
   ถ้า [[ "$1" = "ทดสอบ" ]] ; แล้ว
      ทางออก 0
   elif [[ "$goodflag" = "0" ]] ; แล้ว
      echo "$(date +%r) : $shname ออกด้วย goodflag=0" > $logfold/$shname.quit
   ไฟ
}
กับดัก badquit EXIT
#
# ตัวแปร
โฮสต์ = "$ (ชื่อโฮสต์)"
hostlc="${โฮสต์,,}"
shname="$(ชื่อฐาน$0)"
hostuser="$(getent passwd "1000" | ตัด -d: -f1)"
homefold="/home/$hostuser"
logfold="$homefold/บันทึก"
log="$homefold/$shname.log"
วันที่="$(วันที่ +%Y-%m-%d)"
dom="$(date +%d)" # วันของเดือนที่รันไทม์เป็นตัวกำหนดว่าการสำรองข้อมูลใดที่จะดำเนินการ (โฮมรายวัน โฮมประจำสัปดาห์ บูตรายไตรมาส)
soonwarn="7" # วันล่วงหน้าเพื่อสร้างรายงาน .soon
กรณี $host ใน # $bumount ตำแหน่งแตกต่างกันไปตามอุปกรณ์: Betty จะเมานต์แตกต่างจากที่อื่นทั้งหมด
   เบ็ตตี้)
      bumount="/mnt/จู่โจม"
      ;;
   *)
      bumount="/media/betty-จู่โจม"
      ;;
เอสแซค
bufold="$bumount/$hostlc"
goodflag="0" # สถานะเริ่มต้นของ goodflag เพื่อทริกเกอร์ข้อความออกที่ไม่คาดคิด
#
#เช็คก่อน
# ยืนยันการมีอยู่ของ $bufold พยายามเมานต์หากไม่พบ ตั้งค่าข้อความล้มเหลวหากไม่สำเร็จ
ถ้า [[ ! -e $bufold ]] ; แล้ว
   เมานต์ 192.168.x.x:/mnt/raid $bumount
   นอน5
   ถ้า [[ ! -e $bufold ]] ; แล้ว
      echo "$(date +%r) : $shname ออกเพราะ $bufold ไม่สามารถ mount" > $logfold/$shname.quit
      ธงดี = "1"
      ทางออก 1
   ไฟ
ไฟ
# 
# การจัดการบันทึก
ถ้า [[ -e $log ]] ; แล้ว
   mv $log $logfold/"$(date -r $log +"%Y-%m-%d")"-$shname.log
ไฟ
#
#งานหลัก
# ตั้งค่า targdom ต่อกำหนดการสำรองข้อมูลการบูตแบบเก่า (เพื่อให้มีเวลาสำหรับ .soon)
กรณี $host in
   เบ็ตตี้)
      เป้าหมาย = "8"
      ;;
   เวโรนิก้า)
      targdom="12"
      ;;
   *)
      echo "$(date +%r) : $shname ไม่สามารถระบุ $host" > $logfold/$shname.quit
      ธงดี = "1"
      ทางออก 1
      ;;
เอสแซค   
# กำหนดการสำรองข้อมูลที่จะเรียกใช้ตั้งค่าตัวแปรสุดท้าย
ถ้า [[ "$dom" = "$targdom" ]] ; จากนั้น # targdom จะทริกเกอร์การสำรองข้อมูลที่ไม่ใช่รายวัน
   ถ้า [[ $(วันที่ +%m) -eq "01" ]] || [[ $(วันที่ +%m) -eq "04" ]] || [[ $(วันที่ +%m) -eq "07" ]] || [[ $(วันที่ +%m) -eq "10" ]] ; จากนั้น # การสำรองข้อมูลการบูตรายไตรมาส ม.ค.,เม.ย.,ก.ค.,ต.ค
      ropts="-avuHkbi --delete --exclude-from=$homefold/boot-backup.exclude --backup-dir=$bufold/Backup.$date --log-file=$log" 
      แหล่งที่มา = "/"
   อื่น # การสำรองข้อมูลบ้านรายเดือน
      ropts="-axvuHkbi --delete --exclude-from=$homefold/home-backup.exclude --backup-dir=$bufold/Backup.$date --log-file=$log"
      rsource="/บ้าน"
   ไฟ
อื่น # ไม่ใช่ targdom สำรองบ้านทุกวัน
   ropts="-axvuHkbi --exclude-from=$homefold/home-backup.exclude --backup-dir=$bufold/Backup.$date --log-file=$log" #สำรองข้อมูลที่บ้านทุกวัน
   rsource="/บ้าน"
ไฟ
# หากเป็นการทดสอบ ให้ตั้งค่าตัวแปรให้เหมาะสม
ถ้า [[ "$1" = "ทดสอบ" ]] ; แล้ว
   ropts="-navuHkbi --exclude-from=$homefold/boot-backup.exclude --backup-dir=$bufold/Backup.$date --log-file=$log" # เปิดการทำงานแบบแห้ง
   แหล่งที่มา = "/"
ไฟ
#เรียกใช้การสำรองข้อมูลในที่สุด
rsync $ropts --backup-dir=$bufold/Backup.$date --log-file=$log $rsource $bufold
#
#ตั้งค่าทางออก
ถ้า [[ "$?" = "0" ]] ; แล้ว
# สำเร็จ บันทึกบันทึกแล้ว
   exitcond="สำเร็จ บันทึกบันทึก"
อื่น
#ไม่สำเร็จ ออกจากเงื่อนไข
   exitcond="ไม่สำเร็จ รหัสออก $?"
ไฟ
#
echo "$(date +%r) : $shname เสร็จสิ้น $exitcond" >> $logfold/$shname.done
ธงดี = "1"
sudodus avatar
jp flag
เมื่อคุณพยายามสำรองพาร์ติชั่นรูท `/` จะมีไฟล์ระบบที่ใช้งานอยู่ซึ่งจะถูกแก้ไขโดยกระบวนการ rsync ดังนั้น **ไม่รวมไดเร็กทอรีที่มีไฟล์ดังกล่าว (เช่น `/run` และ `/proc`) หรือบูตจากระบบอื่น** (เช่น ระบบสดที่บูทจาก USB หรือระบบที่สองในระบบดูอัลบูต) ฉันเดาว่าคุณกำลังเรียกใช้สคริปต์ด้วย `sudo` เพื่อให้สามารถอ่านไฟล์ทั้งหมดและรักษาสิทธิ์และความเป็นเจ้าของทั้งหมดได้
Thomas Aichinger avatar
cn flag
ข้อสันนิษฐานแรกของฉันคือมีบางไฟล์ที่ไม่สามารถคัดลอกได้ (ซ็อกเก็ต อุปกรณ์) หากต้องการติดตามปัญหานั้น ให้พยายามกำจัดสคริปต์ทุบตีและเขียนเพียงบรรทัดเดียว rsync --with-all-paramteters จากนั้นลองทำซ้ำข้อผิดพลาดนี้และโพสต์ไว้ที่นี่
Artur Meinild avatar
vn flag
+1 สำหรับการยกเว้นไดเร็กทอรีระบบ ดู[ข้อมูลเกี่ยวกับระบบไฟล์](https://www.linux.com/training-tutorials/linux-filesystem-explained/)เพิ่มเติมที่นี่ ฉันจะถือว่าควรยกเว้น `/dev`, `/proc`, `/run` และ `/sys` เสมอ เนื่องจากสิ่งเหล่านี้เป็นระบบไฟล์เสมือนทั้งหมด
KneadToKnow avatar
us flag
ฉันจะโพสต์ไฟล์ .exclude ของฉันในเย็นวันนี้เมื่อฉันสามารถเปิดดูได้อีกครั้ง ฉันคิดว่าฉันเก็บไดเร็กทอรีที่กล่าวถึงส่วนใหญ่ไว้ในการสำรองข้อมูล ฉันอาจสะดุดบางอย่างเมื่อมองหาสิ่งที่ฉันคิดว่าเป็นปัญหาอื่น แม้ว่า: ฉันคิดว่าการพยายามสำรองไดเร็กทอรี /usr/bin/x11 อาจสร้างการวนซ้ำไม่สิ้นสุด ซึ่งจะอธิบายได้อย่างแน่นอนว่าทำไมสคริปต์ไม่เสร็จสิ้น .
KneadToKnow avatar
us flag
เมื่อฉันไปรับไฟล์ .exclude ของฉัน ฉันค้นพบว่าสคริปต์นั้นยังคงติดขัดอยู่ โดยทำงานถึงจุดนั้นเป็นเวลาประมาณ 17 ชั่วโมง ฉันต้องดูแลสิ่งอื่น แต่ฉันรู้จากซอฟต์แวร์ทำความสะอาดของฉันว่าซอฟต์แวร์ยังคงทำงานอยู่เมื่อการสำรองข้อมูลทุกคืนเริ่มทำงานเมื่อเวลา 01.00 น. ในเช้าวันนี้ ดังนั้นฉันจึงต้องติดตามผลทั้งหมดในวันพรุ่งนี้เมื่อฉันทำได้ นั่งลงและตรวจสอบบันทึกทั้งหมด ฉันยังคงสงสัยว่าปัญหาที่แท้จริงคือ /usr/bin/x11 และไดเร็กทอรีที่คล้ายกันซึ่งหวังว่าการรวมกันของพารามิเตอร์ include-file และ exclud-file ที่ดีจะแยกออก

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา