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