thực hiện một cronjob chờ công việc rsync trước kết thúc


11

Tôi đang sử dụng rsync để sao lưu một số dữ liệu từ máy chủ này sang máy chủ khác. Tất cả đều hoạt động tốt, nhưng có thể mất nhiều thời gian hơn để hoàn thành tùy thuộc vào lượng dữ liệu cần truyền.

Có cách nào đảm bảo để đảm bảo rằng lệnh rsync không bắt đầu trước khi lệnh trước kết thúc bằng cronjob không?

Ví dụ: mỗi giờ tôi chạy lệnh rsync, nhưng có thể quá trình chuyển mất hơn 1 giờ để hoàn thành, do đó, lần tiếp theo sẽ bắt đầu trước khi lệnh trước kết thúc.


Nếu công việc có khả năng mất nhiều hơn một giờ để hoàn thành và bạn đang lên lịch cho nó gần hơn thời lượng, thì bạn đang lên lịch sai cho công việc. Hoặc tìm ra cách cắt giảm thời gian hoặc tăng khoảng thời gian giữa các công việc. Nếu bạn liên tục thực hiện sao lưu từ xa, bạn có thể muốn xem xét một kế hoạch khắc phục thảm họa mới.
vgoff

Câu trả lời:


10

Bạn có thể thực hiện một số loại khóa. Điều này sẽ in số lượng quá trình rsync vẫn đang chạy:

pgrep -cx rsync

Và điều này sẽ chạy rsync chỉ khi không có quá trình rsync khác tồn tại:

pgrep -cx rsync || rsync ...

Việc sử dụng -xsẽ ngăn việc vô tình khớp các tên không mong muốn (ví dụ: "fooba rsync hronizator" hoặc "not_an_ rsync _totally" - nó hoạt động giống như pgrep -c ^rsync$)


Trong trường hợp không rõ ràng. -c đếm số lượng quá trình có tên rsync. Nếu đây không phải là 0 thì shell sẽ hiểu kết quả là đúng (không sai). | | "Hoặc dòng" xem mục đầu tiên là đúng và không bận tâm để chạy mục thứ hai, rsync.
cướp

12

Bạn có thể sử dụng lệnh bầy để giúp bạn làm điều này, ví dụ trong trường hợp flock -nnày có thể là điều bạn muốn vì nó sẽ gây ra lỗi ngay lập tức nếu lệnh không thể lấy được khóa, ví dụ

30 * * * *  /usr/bin/flock -n /tmp/myRsyncJob.lck /path/to/your/rsyncScript 

Nói chung, tên tệp dự đoán trong / tmp thường nguy hiểm do điều kiện chủng tộc và quyền truy cập rộng rãi vào thư mục / tmp. Có an toàn trong trường hợp này?
mc0e

Trong trường hợp này, một tên dự đoán không chỉ an toàn, nó là cần thiết; đó là những gì làm cho khóa (danh từ) khóa (động từ). Nói cách khác, trạng thái của khóa được dựa cụ thể và duy nhất dựa trên sự tồn tại của một tệp có tên cụ thể, có thể dự đoán được. Nếu tên tệp không thể đoán trước được hoặc nếu nó thay đổi linh hoạt, thì đàn sẽ cho phép rsync tự chạy, đánh bại mục đích. Tuy nhiên, bạn có thể giảm bớt những lo lắng của mình và imo "chính xác" hơn một chút, bằng cách đặt tệp khóa ở đâu đó như /var/runthay vào đó.
Evan de la Cruz

3

Nếu bạn sẵn sàng xem xét các công cụ khác, bạn cũng có thể xem qua bản sao lưu dự phòng . Nó sử dụng librsync để thực hiện sao lưu và lưu một số lượng deltas / gia tăng có thể định cấu hình. Nó cũng khóa để chỉ một quá trình sao lưu dự phòng có thể chạy bất cứ lúc nào.


Tôi sử dụng sao lưu dự phòng. Nhưng bạn cần cẩn thận trong thiết lập này vì sao lưu dự phòng mất nhiều thời gian hơn để hoàn thành so với rsync.
mgabriel

3

Đây là những gì tôi sẽ làm. Tạo tập lệnh bao quanh rsync để tạo tập tin khóa.

script 1
- create lock file
- rsync
- remove lock file

script 2 (running later then script 1)
- check if lock file is there
    - if not run
    - if it is there wait 10 minutes in a loop. break out of lopp when the lock file is gone
- continue to run script

2
Chỉ cần chắc chắn cũng xóa tệp khóa sau khi khởi động lại, nếu không bạn có thể kết thúc với một quá trình không bao giờ chạy lại.
John Gardeniers

2

Câu trả lời của tôi có phần giống với những gì Mike nói.

Trong kịch bản, bạn nên đặt một cái gì đó như thế này:

  • tạo một tập tin khóa
  • Kiểm tra sự tồn tại của tệp khóa khi bạn chạy nó lần sau.

Nhưng có một điều rất quan trọng bạn nên làm. và rằng để thực hiện một hệ thống bẫy.

Vì vậy, với điều đó, những gì bạn có thể làm là ngay cả khi bằng cách nào đó tập lệnh của bạn bị giết hoặc ai đó đã giết nó, thì bạn có thể bẫy tín hiệu đó và xóa tệp khóa, để bạn không có tệp khóa cũ.

Bạn có thể đọc làm thế nào để thực hiện điều đó ở đây .

Chỉ một điều nhỏ, bạn không thể bẫy tín hiệu 9, ý tôi là nếu có ai đó làm kill -9, bạn không thể bẫy tín hiệu đó vì tín hiệu đó tương tác trực tiếp với kernel và không có cách nào để bẫy nó.

Ngoài ra, như được đề xuất bởi John, bạn cần xóa tệp khóa mỗi khi hệ thống của bạn khởi động lại, chỉ để đảm bảo rằng không còn tệp cũ nào.

Điều đó bạn có thể dễ dàng thực hiện bằng cách đặt một rm -f <FILE>lệnh nhỏ trong /etc/rc.local


1

Có một cái nhìn về anacron (cron anachronistic) với công tắc -s (serialization). Nối tiếp đảm bảo rằng lệnh sẽ không được gọi lại nếu lệnh trước vẫn đang chạy.


Bạn có thể đã hiểu nhầm câu hỏi.
John Gardeniers

Tôi không nghĩ vậy. Câu hỏi đặt ra là "Có cách nào đảm bảo để đảm bảo rằng lệnh rsync không bắt đầu trước khi lệnh trước kết thúc bằng cronjob không?" Anacron chạy cronjobs với chức năng bổ sung / khác nhau. Nối tiếp đảm bảo rằng bất kỳ lệnh nào bạn gọi sẽ không bắt đầu cho đến khi lệnh trước kết thúc.
tu-Tái lập Monica-dor duh

Lời xin lỗi của tôi. Chính tôi đã đọc sai câu hỏi.
John Gardeniers


0

Tôi không thể có được giải pháp của mgabriel để hoạt động trên OSX vì phiên bản OSX của pgrep dường như không có tùy chọn -c (tôi cho rằng đây là số đếm). Thay vào đó tôi đã sử dụng như sau:

[ $(pgrep ping | wc -l) -eq 0 ] && ping multiplay.co.uk || echo "Sorry, ping already in progress"

Tôi đã sử dụng ping như một lệnh ví dụ.

Hi vọng điêu nay co ich.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.