Điểm:0

Tập lệnh Bash rsync sẽ không hoàn thành trên các bản sao lưu lớn

lá cờ us

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"
sudodus avatar
lá cờ jp
Khi bạn cố gắng sao lưu phân vùng gốc `/`, cũng sẽ có các tệp hệ thống đang hoạt động, tệp này sẽ được sửa đổi bởi quy trình rsync. Vì vậy **hoặc loại trừ các thư mục chứa các tệp như vậy (ví dụ: `/run` và `/proc`) hoặc khởi động từ hệ thống khác** (ví dụ: hệ thống trực tiếp được khởi động từ USB hoặc hệ thống thứ hai trong hệ thống khởi động kép). Tôi đoán rằng bạn đã chạy tập lệnh với `sudo` để có thể đọc tất cả các tệp và bảo vệ tất cả các quyền và quyền sở hữu.
Thomas Aichinger avatar
lá cờ cn
Dự đoán đầu tiên của tôi là có một số tệp không thể sao chép được (ổ cắm, thiết bị) Để theo dõi vấn đề đó, hãy thử loại bỏ tập lệnh bash và chỉ viết một dòng rsync --with-all-paramteters. Sau đó thử tạo lại lỗi này và đăng nó ở đây.
Artur Meinild avatar
lá cờ vn
+1 để loại trừ các thư mục hệ thống. Xem tại đây để biết thêm [thông tin về hệ thống tệp](https://www.linux.com/training-tutorials/linux-filesystem-explained/). Tôi cho rằng `/dev`, `/proc`, `/run` và `/sys` phải luôn bị loại trừ vì đây đều là các hệ thống tệp ảo.
KneadToKnow avatar
lá cờ us
Tôi sẽ đăng tệp .exclude của mình vào tối nay khi tôi có thể truy cập lại tệp đó. Tôi nghĩ rằng tôi đã giữ hầu hết các thư mục được đề cập ra khỏi bản sao lưu. Tuy nhiên, tôi có thể đã tình cờ phát hiện ra điều gì đó khi xem xét vấn đề mà tôi nghĩ là một vấn đề khác: Tôi nghĩ rằng việc cố gắng sao lưu thư mục /usr/bin/x11 có thể đang tạo ra một vòng lặp vô hạn, điều này chắc chắn sẽ giải thích tại sao tập lệnh không bao giờ kết thúc .
KneadToKnow avatar
lá cờ us
Chà, khi tôi đi lấy tệp .exclude của mình, tôi phát hiện ra rằng trên thực tế, tập lệnh vẫn đang hoạt động, đã chạy vào thời điểm đó được khoảng 17 giờ. Tôi phải quan tâm đến những việc khác, nhưng tôi biết từ phần mềm quản gia của mình rằng nó vẫn đang chạy khi sao lưu hàng đêm thông thường bắt đầu lúc 1 giờ sáng nay, vì vậy tôi sẽ cần theo dõi tất cả những việc đó vào ngày mai khi có thể ngồi xuống và kiểm tra tất cả các bản ghi. Tôi vẫn nghi ngờ vấn đề thực sự là /usr/bin/x11 và có thể là các thư mục tương tự, hy vọng rằng sự kết hợp tốt giữa các tham số tệp bao gồm và tệp loại trừ sẽ giải quyết được.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.