Điểm:0

tập lệnh sao lưu cơ sở dữ liệu sqlite, khi được chạy dưới dạng cron, db và tên bị xáo trộn

lá cờ in

Tôi có một crontab:

 * * * * * /home/ipa/web/backup.sh > /dev/null 2>&1

(Không, nó không chạy mỗi phút chỉ thử nghiệm ở đây)

Backup.sh có cái này:

#!/usr/bin/env sh



sqlite3 /home/ipa/web/ipa_django/mysite/db.sqlite3 ".backup 'backup_file.sqlite3'"
src="/home/ipa/web/backup_file.sqlite3"
để giây=$(ngày +%H)*3600+$(ngày +%M)*60+$(ngày +%S)
tiếng vang $ giây
tên tệp = "db.sqlite3"
tiếng vang $filename.$seconds
dest="/home/ipa/web/db_backups/"$filename.$seconds
cp $src $dest
cd /home/ipa/web/db_backups
tar -cvzf ipadbbackup.tar.gz $filename.$seconds
cd/nhà/ipa/web/
cp /home/ipa/web/db_backups/ipadbbackup.tar.gz ipadbbackup.tar.gz
rm /home/ipa/web/db_backups/$filename.$seconds
rm /home/ipa/web/db_backups/ipadbbackup.tar.gz
#rm "$srcfile"
/usr/bin/bash start-app.sh;
echo "Chạy sao lưu email"
sao lưu python2.7_via_email.py
rm ipadbbackup.tar.gz

Ý tưởng là tôi sao chép cơ sở dữ liệu vào một khu vực đầu, nén nó lên, sao chép nó vào nơi mà một tệp .py khác có thể tìm thấy và gửi nó qua email dưới dạng bản sao lưu.

Vấn đề là:

Nếu tôi chạy tập lệnh này từ nơi nó tồn tại: /nhà/ipa/web/

với một ./backup.sh

Nó hoạt động rất tốt, tôi nhận được tệp trong email của mình hoạt động rất tốt: db.sqlite3.77627

hoặc những gì không ... vấn đề là khi nó chạy dưới dạng cron, tệp không hoàn chỉnh và tên tệp là:

db.sqlite3.

Tôi không thể hiểu điều gì về việc nó chạy như một cron đang khiến nó thất bại về cơ bản? Tệp trong tar cũng nhỏ hơn 2,1k? Vì vậy, không chắc chuyện gì đang xảy ra... thậm chí không biết phải tìm ở đâu.

Egidijus avatar
lá cờ nz
Đối với những thứ như sao lưu, tôi khuyên bạn nên sử dụng đường dẫn tuyệt đối cho tệp nhị phân để đảm bảo rằng bạn đang sử dụng phiên bản dự kiến. +1 bạn nên sử dụng bash hoặc tạo một cronjob để in các vars env để gỡ lỗi những gì cron của bạn chạy mọi thứ với, so với những gì bạn có.
Điểm:4
lá cờ gu

Rất có thể, bạn không thực sự chạy ./backup.sh khi chạy thủ công mà đúng hơn là bash ./backup.sh.

Cách duy nhất tuân thủ POSIX để tính giá trị thông qua trình bao là với $(( expr )).

Nói chung, trừ khi bạn có lý do chính đáng, các tập lệnh nên sử dụng bash vì hầu hết mọi người không biết sự khác biệt giữa sh và bash và sẽ chỉ viết các tập lệnh bị hỏng.

#!/usr/bin/env bash

đặt -e
đặt -u

khai báo -r db_src="/home/ipa/web/ipa_django/mysite/db.sqlite3"
khai báo -r db_bak="/home/ipa/web/backup_file.sqlite3"
khai báo -r db_dst="/home/ipa/web/db_backups/db.sqlite3.$[ EPOCHSECONDS % 86400 ]"
 
sqlite3 "${db_src}" ".backup 'backup_file.sqlite3'"
cp "${db_bak}" "${db_dst}"
cd "$(tên thư mục "${db_dst}" )"
tar -czf "/home/ipa/web/ipadbbackup.tar.gz" "$( tên cơ sở "${db_dst}" )"
rm "${db_dst}"

echo "Chạy sao lưu email"
cd "/home/ipa/web" 
sao lưu python2.7_via_email.py
rm ipadbbackup.tar.gz

Luôn đảm bảo ghi nhật ký đầu ra cron của bạn khi cố gắng gỡ lỗi, tôi đoán bạn đã thấy một lệnh không tìm thấy: hãy để một vài nơi.

Ginnungagap avatar
lá cờ gu
Tôi đã phải nhập nội dung này trên điện thoại của mình, vì vậy vui lòng sửa bất kỳ lỗi nào thông qua nút chỉnh sửa và chấp nhận lời xin lỗi trước của tôi về bất kỳ lỗi nào mà tôi có thể đã mắc phải

Đă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.