Trong khoảng hơn một năm qua, tôi đã cố gắng học tập lệnh bash trên Ubuntu (một hộp 20.04 LTS và một hộp 21.04). Tôi cảm thấy rằng các kỹ năng của mình đang tiến triển tốt đẹp, nhưng tôi đã hết cách với một tập lệnh sao lưu cụ thể mà tôi đã viết.
Tóm lại, nếu tập lệnh sao lưu chỉ cố sao lưu thư mục/home của tôi, thì nó sẽ chạy trơn tru từ đầu đến cuối, nhưng nếu nó đang cố sao lưu thư mục/của tôi, thì nó sẽ chạy cho đến khi quá trình rsync hoàn tất (bao gồm cả việc tạo tệp nhật ký ), và sau đó tập lệnh dường như dừng lại, mặc dù tôi có một số mã vệ sinh theo sau để cảnh báo tôi. Tôi thậm chí đã thêm một bẫy thoát, nhưng nó không được kích hoạt.
Tôi không biết những gì tôi đang thiếu, nhưng tôi háo hức cố gắng học hỏi, nếu có ai có thể giúp tôi.
Tôi không biết liệu nó có hữu ích hay không, nhưng đây là phiên bản đơn giản hóa một chút trong tập lệnh của tôi:
#!/bin/bash
#
# sao lưu
# hợp nhất các thư mục sao lưu, nhà và/hoặc thư mục gốc để tấn công Betty
# chạy hàng ngày từ sudo crontab (thời gian thay đổi tùy theo thiết bị); ngày trong tháng xác định sao lưu nào được thực hiện
#
# tài liệu liên quan
# tạo backup.log trong thư mục chính của người dùng chính, lưu trữ backup.log hiện có vào thư mục nhật ký dưới dạng yyyy-mm-dd-backup.log
# yêu cầu hai tệp trong $homefold: home-backup.exclude và boot-backup.exclude, để cung cấp loại trừ sao lưu cho rsync
#
# thoát bẫy
chức năng bỏ dở {
nếu [[ "$1" = "kiểm tra" ]] ; sau đó
thoát 0
elif [[ "$goodflag" = "0" ]] ; sau đó
echo "$(date +%r) : $shname đã thoát với goodflag=0" > $logfold/$shname.quit
fi
}
Bẫy thoát EXIT
#
# biến
máy chủ = "$ (tên máy chủ)"
hostlc="${host,,}"
shname="$(tên cơ sở $0)"
hostuser="$(getent passwd "1000" | cut -d: -f1)"
homefold="/home/$hostuser"
logfold="$homefold/logs"
log="$homefold/$shname.log"
ngày="$(ngày +%Y-%m-%d)"
dom="$(date +%d)" # ngày trong tháng trong thời gian chạy xác định bản sao lưu nào được thực hiện (nhà hàng ngày, nhà hàng tuần, khởi động hàng quý)
soonwarn="7" trước # ngày để tạo báo cáo .soon
trường hợp $host ở vị trí # $bumount khác nhau tùy theo thiết bị: Betty gắn nó khác với tất cả các thiết bị khác
Betty)
bumount="/mnt/raid"
;;
*)
bumount="/media/betty-raid"
;;
esac
bufold="$bumount/$hostlc"
goodflag="0" # trạng thái mặc định của goodflag để kích hoạt thông báo thoát không mong muốn
#
# kiểm tra trước
# xác nhận sự tồn tại của $bufold, cố gắng gắn kết nếu không tìm thấy, đặt thông báo lỗi nếu không thành công
nếu [[ ! -e $bufold ]] ; sau đó
gắn kết 192.168.x.x:/mnt/raid $bumount
ngủ 5
nếu [[ ! -e $bufold ]] ; sau đó
echo "$(date +%r) : $shname đã thoát vì không thể gắn $bufold"> $logfold/$shname.quit
cờ tốt = "1"
thoát 1
fi
fi
#
# quản lý nhật ký
nếu [[ -e $log ]] ; sau đó
mv $log $logfold/"$(date -r $log +"%Y-%m-%d")"-$shname.log
fi
#
# nhiệm vụ chính
# đặt targdom theo lịch trình sao lưu khởi động cũ (để dành thời gian cho .soon)
trường hợp $host trong
Betty)
targdom="8"
;;
Veronica)
targdom="12"
;;
*)
echo "$(date +%r) : $shname không thể xác định $host"> $logfold/$shname.quit
cờ tốt = "1"
thoát 1
;;
esac
# xác định bản sao lưu nào sẽ chạy, đặt các biến cuối cùng
nếu [[ "$dom" = "$targdom" ]] ; sau đó # targdom kích hoạt sao lưu không hàng ngày
nếu [[ $(date +%m) -eq "01" ]] || [[ $(date +%m) -eq "04" ]] || [[ $(date +%m) -eq "07" ]] || [[ $(date +%m) -eq "10" ]] ; sau đó # sao lưu khởi động hàng quý Tháng 1, Tháng 4, Tháng 7, Tháng 10
ropts="-avuHkbi --delete --exclude-from=$homefold/boot-backup.exclude --backup-dir=$bufold/Backup.$date --log-file=$log"
nguồn = "/"
khác # sao lưu nhà hàng tháng
ropts="-axvuHkbi --delete --exclude-from=$homefold/home-backup.exclude --backup-dir=$bufold/Backup.$date --log-file=$log"
nguồn = "/ nhà"
fi
other # not targdom, sao lưu tại nhà hàng ngày
ropts="-axvuHkbi --exclude-from=$homefold/home-backup.exclude --backup-dir=$bufold/Backup.$date --log-file=$log" #sao lưu tại nhà hàng ngày
nguồn = "/ nhà"
fi
# nếu đây là một bài kiểm tra, hãy đặt các biến một cách thích hợp
nếu [[ "$1" = "kiểm tra" ]] ; sau đó
ropts="-navuHkbi --exclude-from=$homefold/boot-backup.exclude --backup-dir=$bufold/Backup.$date --log-file=$log" # chạy khô BẬT
nguồn = "/"
fi
# chạy sao lưu, cuối cùng
rsync $ropts --backup-dir=$bufold/Backup.$date --log-file=$log $rsource $bufold
#
# thiết lập điều kiện thoát
nếu [[ "$?" = "0" ]] ; sau đó
# thành công, đã lưu nhật ký
exitcond="thành công, đã lưu nhật ký"
khác
# không thành công, thoát điều kiện
exitcond="không thành công, mã thoát $?"
fi
#
echo "$(date +%r) : $shname đã hoàn thành $exitcond" >> $logfold/$shname.done
cờ tốt = "1"