Công việc định kỳ, bắt đầu ngẫu nhiên nhưng trong khung thời gian


11

Tôi muốn một tập lệnh chạy mỗi ngày một lần, mỗi ngày, bắt đầu bất kỳ lúc nào trong khoảng từ 0900 đến 1200.
Tôi không hoàn toàn chắc chắn về cú pháp dấu gạch ngang - điều đó có nghĩa là tập lệnh sẽ chạy MERYI giờ 9-12, hoặc nó sẽ bắt đầu RANDOMLY giữa 9-12? Bởi vì tôi cần cái sau.

Câu trả lời:


7

Tôi chưa bao giờ thấy một triển khai cron có cách để điều hành một công việc tại một thời điểm ngẫu nhiên. Đó là một yêu cầu kỳ lạ. Như tài liệu nêu, 9-12là một phím tắt cho 9,10,11,12, và có nghĩa là mỗi giờ từ 9 đến 12.

Nếu bạn muốn chạy một công việc tại một thời điểm ngẫu nhiên, hãy chạy công việc vào đầu khoảng thời gian và thêm một độ trễ ngẫu nhiên. Ví dụ: để chạy vào một giờ ngẫu nhiên trong khoảng từ 9 đến 12:

SHELL=/bin/bash
0 9 * * * sleep $((3600 * (RANDOM % 4))); do_stuff

Lưu ý rằng RANDOMyêu cầu bash hoặc ksh, nó có thể không có sẵn trong vỏ mặc định.

Nếu bạn muốn chạy vào thời gian ngẫu nhiên trong khoảng từ 9 đến 12, với độ phân giải thứ hai, bạn có thể sử dụng RANDOM % 10800làm độ trễ, nhưng vì RANDOMnằm trong phạm vi 0..32767, sẽ có sự sai lệch về độ trễ giữa 0 và 32768% 10800 = 368. Để tránh sự thiên vị này:

SHELL=/bin/bash
0 9 * * * max=$((32768/10800*10800)); while delay=$RANDOM; ((delay > max)); do :; done; sleep $((delay % 10800)); do_stuff

5
"Đó là một yêu cầu kỳ lạ." Tôi không đồng ý. Nhiều ứng dụng, đặc biệt là những ứng dụng cần kiểm tra định kỳ với máy chủ (chẳng hạn như trình quản lý gói hoặc máy khách quản lý cấu hình), cần phải xử lý thời gian thực hiện của chúng để tránh tình trạng bầy đàn . Trên thực tế, nhiều ứng dụng như vậy có các tùy chọn splay tích hợp (ví dụ: --randomwaitđối số với yum hoặc --splayđối số với đầu bếp-khách hàng), nhưng đối với những ứng dụng không có, thời gian thực hiện ngẫu nhiên sẽ là một tính năng hữu ích cần có trong lịch trình công việc.
jayhendren

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.