Câu trả lời:
Lệnh trong crontab được thực thi với /bin/sh
để bạn có thể sử dụng mở rộng số học để tính xem liệu modulo phút hiện tại 25 có bằng không:
*/5 * * * * [ $(( $(date +\%s) / 60 \% 25 )) -eq 0 ] && your_command
cron
sẽ chạy toàn bộ mục nhập này cứ sau 5 phút, nhưng chỉ khi phút hiện tại (tính bằng phút kể từ kỷ nguyên) modulo 25 bằng 0 thì nó sẽ chạy your_command
.
Như những người khác đã chỉ ra, 1 ngày không chia hết cho 25 phút, do đó, điều này sẽ không gây ra your_command
chạy cùng một lúc mỗi ngày, nhưng nó sẽ chạy cứ sau 25 phút.
Đặt cược tốt nhất của bạn là chạy ở 20 phút hoặc 30 phút.
Điều tốt nhất tiếp theo của bạn có thể là kích hoạt cứ sau 5 phút, sau đó giữ số đếm nội bộ hoặc dấu thời gian và chạy mọi kích hoạt thứ 5 hoặc nếu 25 phút trôi qua kể từ lần chạy cuối cùng.
Phức tạp hơn sẽ là tính toán thời gian chính xác trong một ngày, bắt đầu từ nửa đêm và chấp nhận lỗi vào cuối ngày. Điều này sẽ liên quan đến việc sao chép mục crontab vào các giờ khác nhau.
Phức tạp hơn là sẽ tính toán thời gian trong cả tháng, bao gồm nhiều bản sao của mục crontab để bao gồm các kết hợp khác nhau.
Cuối cùng, bạn có thể tự thực hiện luôn trên daemon và thực hiện lập kế hoạch.
Tôi không có kinh nghiệm trực tiếp với nó, nhưng fcron dường như làm những gì bạn muốn ra khỏi hộp. Theo tài liệu của nó, bạn có thể chỉ định tần số:
# Get our mails every 30 minutes
@ 30 getmails -all
# make some security tests every 48 hours of system up time,
# force a mail to be sent to root even if there is no output
@mailto(root),forcemail 2d /etc/security/msec/cron-sh/security.sh
@ 25 command
nên làm thủ thuật.
Hãy để tôi giải thích ngắn gọn vấn đề ở đây. Nhập 25 trong trường phút gây racron
thực hiện khi số phút hiện tại bằng 25, tức là một lần một giờ. Bạn có thể nhập danh sách các trận đấu, vấn đề là 60 (phút của một giờ) không thể chia hết cho 25, vì vậy bạn cần thêm một vài mục dựa trên giờ. Bội số ít phổ biến nhất của 60 & 25 là 300, tức là 5 * 60. vì vậy bạn sẽ cần phải quay vòng trong 5 giờ cho đến khi trở về điểm bắt đầu ban đầu. ví dụ:
0, 25, 50
15, 40
5, 30, 55
20, 45
10, 35
...
Nhưng ở đây một lần nữa, 24 (giờ một ngày) không thể chia hết cho 5, bội số chung ít nhất của 5 & 24 chỉ đơn giản là 5 * 24 = 120. và cứ thế ...
Bạn có thể chơi với thời gian sửa đổi cuối cùng của tệp
Tạo một tập lệnh nhỏ (ví dụ /usr/local/bin/age
) sẽ xuất tuổi của tệp:
#bin/sh
echo $(( $( date +%s ) - $( stat -c %Z $1 ) ))
Crontab của bạn sẽ trông như thế này (giả sử 25 phút bằng 1500 giây nếu tôi đúng)
* * * * * [ $(/usr/local/bin/fileage /var/tmp/your_command.offset) -gt 1500 ] && touch /var/tmp/your_command.offset && your_command
Lưu ý rằng tôi sử dụng /var/tmp
thay /tmp
vì vì theo FHS, nó không bị xóa khi tắt / khởi động hệ thống.
Tôi nghĩ rằng sau đây nên làm việc 0 0/25 * * *?