rsync với cron job mỗi phút vấn đề


0

Tôi đang truyền tệp qua mạng bằng rsync trong công việc định kỳ chạy cứ sau 1 phút, nhiệm vụ là bất cứ khi nào có tệp mới, nó phải bắt đầu tải lên trên máy chủ từ xa:

Vì tôi mới nên làm sai lớn ở đây:

* * * * * rsync -azP /local_path user@x.x.x.x:/remote_path > /dev/null

rsync tạo tệp tạm thời (ở đầu từ xa) và vào phút tiếp theo, nó sẽ tạo lại tệp tạm thời (ở đầu từ xa) sau vài phút mạng của tôi bắt đầu bị sặc và không còn băng thông tải lên, sau đó tôi giết tất cả các quy trình rsync và sao chép tại một thời điểm.

Cần tự động này xin vui lòng giúp đỡ.

Cảm ơn


Tìm hiểu xem rsync thực sự mất bao lâu, sau đó lên lịch ít nhất là gấp bốn lần thời gian này. Mỗi phút đều làm quá sức - máy tính của bạn sẽ không làm gì khác ngoài rsync.
harrymc

Câu trả lời:


1

Có vẻ như điều này là do lệnh mất nhiều hơn một phút để chạy, vì vậy các lệnh chồng chất cho đến khi hệ thống của bạn bị thiếu tài nguyên.

Bạn có thể đảm bảo rằng chỉ có một ví dụ về điều đó rsync chạy bằng cách sử dụng một tập tin khóa. util-linux bao gồm một trình bao bọc khóa tập tin được gọi là flock, mà bạn có thể sử dụng trong crontab của mình như vậy:

* * * * * /usr/bin/flock -n '/tmp/example.lock' -c 'rsync -azP /local_path user@x.x.x.x:/remote_path' > /dev/null

Trong ví dụ trên, đường dẫn tệp khóa là /tmp/example.lock, nhưng bạn có thể đặt nó thành bất cứ điều gì hợp lý. -n sẽ ngăn chặn flock các lệnh từ chồng chất lên vì nó sẽ thoát ngay lập tức thay vì chờ khóa được phát hành để tiếp tục.


Ngoài ra, bạn cũng có thể ngăn lệnh cron của mình chồng chất bằng cách tạo tập lệnh với khóa khá đơn giản, đảm bảo chỉ có thể chạy một phiên bản của tập lệnh:

#!/bin/bash

PIDFILE=/tmp/example.pid

if [ -f "$PIDFILE" ]
then
        PID="$(cat "$PIDFILE")"
        ps -p $PID > /dev/zero 2>&1
        if [ $? -eq 0 ]
        then
                echo "Instance of this script is still running as PID $PID"
                exit 1
        fi
fi

echo $$ > $PIDFILE
if [ $? -ne 0 ]
then
        echo "Could not create PID file: $PIDFILE"
        exit 1
fi

# YOUR CODE GOES BELOW
rsync -az /local_path user@x.x.x.x:/remote_path
# YOUR CODE GOES ABOVE

rm -f "$PIDFILE"

Cơ chế khóa lấy cảm hứng từ Ngăn chặn việc thực hiện công việc cron trùng lặp bởi Benjamin Cane

Lưu ý rằng giới hạn chính trong tập lệnh là nếu tập tin PID không bị xóa vì bất kỳ lý do gì và quá trình khác có cùng bộ điều khiển, tập lệnh sẽ thoát một cách sai lầm.

Lưu tập lệnh này ở đâu đó, như trong /usr/local/bin/example.sh, chmod +x /usr/local/bin/example.sh, và sau đó gọi nó từ crontab của bạn như thế này:

* * * * * /usr/local/bin/example.sh > /dev/null

1
Kịch bản nguy hiểm. Nếu máy bị dừng cưỡng bức hoặc trường hợp mất điện thì tệp PID đã lưu sẽ tồn tại mãi mãi rsync khởi đầu. Cũng thế, rm lệnh trong tập lệnh như vậy phải được thực thi thông qua trap để chắc chắn trong trường hợp ví dụ khởi động lại hoặc tắt máy thì tệp PID sẽ bị xóa. Ngoài ra, khuyến khích sinh viên thực hiện ít nhất một phần công việc thay vì cung cấp cho họ giải pháp miễn phí
Alex

0

Trước hết loại bỏ -P tùy chọn, cron thực sự sẽ không thấy tiến bộ.

Bạn cần thực hiện một số cơ chế khóa, đừng gọi rsync trực tiếp từ cron, nhưng tạo một số script thay vào đó sẽ được sử dụng trong cron. Trong tập lệnh, kiểm tra điều kiện đầu tiên nếu rsync đã chạy (ví dụ đầu ra grep ps), nếu nó chạy thì chỉ cần thoát tập lệnh, nếu không thì chạy rsync.

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.