ในช่วงปีที่แล้วฉันพยายามเรียนรู้การเขียนสคริปต์ทุบตีบน 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"