Điểm:5

Tập lệnh bash sao lưu đơn giản với nohup và rsync

lá cờ in

Tôi có lệnh đơn giản sau để bắt đầu quá trình sao lưu của mình ở chế độ nền với Nohup:

nohup rsync -a /src /đích &

Tôi đang cố gắng tìm giải pháp thích hợp để lấy mã thoát và gửi thông báo không thành công hoặc thành công vào tệp nhật ký hoặc thư. Để đạt được điều đó tôi đã thử như sau:

nohup rsync -a /src/ /target/ &
oldpid=$!
đợi $oldpid

nếu [[ $? -eq 0 ]]
sau đó
        tiếng vang "THÀNH CÔNG"
khác
        lặp lại "THẤT BẠI"
fi

Mã có vẻ hoạt động tốt nhưng tôi thực sự không làm bây giờ nếu đây là một cách tiếp cận đáng tin cậy. Tôi có hai lo lắng:

  • Có thể biến $? bị ghi đè khi một lệnh khác được thực thi ở giữa?
  • đợi $oldpid gây rối với cách không đồng bộ của Nohup?

Hoặc có thể logic này chỉ là ngớ ngẩn và đơn giản là có một cách tiếp cận tốt hơn?

marcelm avatar
lá cờ cn
Bạn có đang sử dụng cron để chạy lệnh rsync không? Nếu vậy, bạn đã cân nhắc sử dụng [chronic](https://github.com/docwhat/chronic) (và đảm bảo cron có thể gửi thư) chưa?
Điểm:4
lá cờ cn

Theo câu hỏi:

Có thể biến $? bị ghi đè khi một lệnh khác được thực thi ở giữa?

Câu trả lời là VÂNG. biến $? chứa trạng thái thoát của tác vụ cuối cùng. Ví dụ:

$ sai; tiếng vang $?
1
$ sai; thật; tiếng vang $?
0
$ sai; thật; sai; tiếng vang $?
1

Giống như biến $! chứa PID của tác vụ nền cuối cùng.

Thẩm quyền giải quyết: Devhints.io: Bảng mã kịch bản Bash


Theo câu hỏi:

đợi $oldpid gây rối với cách không đồng bộ của nohup?

Nó không nên - không phải nó được thiết kế chính xác cho những nhiệm vụ như vậy sao? :)


Theo câu hỏi:

Hoặc có thể logic này chỉ là ngớ ngẩn và đơn giản là có một cách tiếp cận tốt hơn?

Đối với tôi không rõ tại sao bạn đẩy rsync vào lai lịch và sau đó đợi đã đối với nó, thay vào đó, chỉ cần thực hiện lệnh và sau đó thực hiện kiểm tra.

#!/bin/bash
rsync -a source.file đích.file 2>/dev/null

nếu [[ $? -eq 0 ]]; sau đó lặp lại "THÀNH CÔNG"; khác lặp lại "THẤT BẠI"; fi
  • 2>/dev/null được sử dụng ở đây để ngăn chặn các thông báo lỗi của rsync, nhưng bạn có thể lưu chúng trong tệp tạm thời và đính kèm vào email.

Nhưng có lẽ nó không phải là toàn bộ kịch bản ...


Ngoài ra, trong các hàng đầu tiên của giúp đợi được cung cấp các thông tin sau.

đợi: đợi [-fn] [id ...]

Đợi công việc hoàn thành và trả lại trạng thái thoát.

Vì vậy, bạn có thể sử dụng đầu ra của đợi đã trực tiếp trong nếu bản tường trình. Tôi đã thực hiện thử nghiệm thành công cho phương pháp này.

#!/bin/bash
nohup rsync -a source.file đích.file 2>/dev/null &
oldpid=$!

nếu đợi $oldpid
sau đó
        tiếng vang "THÀNH CÔNG"
khác
        lặp lại "THẤT BẠI"
fi
  • 2>/dev/null được sử dụng ở đây để ngăn chặn các thông báo lỗi của nohup, trong khi rsync thông báo lỗi đi đâu đó trong nền.

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