Bạn có */30
trong trình xác định phút - có nghĩa là mỗi phút nhưng với bước 30 (nói cách khác, cứ sau nửa giờ). Vì cron
không đi xuống độ phân giải dưới phút, bạn sẽ cần tìm cách khác.
Một khả năng, mặc dù đó là một chút bùn (a) , là có hai công việc, một công việc bù 30 giây:
# Need these to run on 30-sec boundaries, keep commands in sync.
* * * * * /path/to/executable param1 param2
* * * * * ( sleep 30 ; /path/to/executable param1 param2 )
Bạn sẽ thấy tôi đã thêm nhận xét và định dạng để đảm bảo dễ dàng giữ cho chúng được đồng bộ hóa.
Cả hai cron
công việc thực sự chạy mỗi phút nhưng công việc sau sẽ đợi nửa phút trước khi thực hiện "thịt" của công việc , /path/to/executable
.
Đối với các cron
tùy chọn khác (không dựa trên cơ sở), hãy xem các câu trả lời khác tại đây, đặc biệt là các câu hỏi được đề cập fcron
và systemd
. Đây có lẽ là tốt hơn giả sử hệ thống của bạn có khả năng sử dụng chúng (chẳng hạn như cài đặt fcron
hoặc có một bản phân phối systemd
trong đó).
Nếu bạn không muốn sử dụng giải pháp bùn, bạn có thể sử dụng giải pháp dựa trên vòng lặp với một sửa đổi nhỏ. Bạn vẫn sẽ phải quản lý để giữ cho quá trình của bạn chạy ở một số dạng, nhưng, khi đã được sắp xếp, tập lệnh sau sẽ hoạt động:
#!/bin/env bash
# Debug code to start on minute boundary and to
# gradually increase maximum payload duration to
# see what happens when the payload exceeds 30 seconds.
((maxtime = 20))
while [[ "$(date +%S)" != "00" ]]; do true; done
while true; do
# Start a background timer BEFORE the payload runs.
sleep 30 &
# Execute the payload, some random duration up to the limit.
# Extra blank line if excess payload.
((delay = RANDOM % maxtime + 1))
((maxtime += 1))
echo "$(date) Sleeping for ${delay} seconds (max ${maxtime})."
[[ ${delay} -gt 30 ]] && echo
sleep ${delay}
# Wait for timer to finish before next cycle.
wait
done
Mẹo nhỏ là sử dụng một sleep 30
nhưng để khởi động nó trong nền trước khi tải trọng của bạn chạy. Sau đó, sau khi tải xong, chỉ cần chờ nền sleep
kết thúc.
Nếu tải trọng mất n
vài giây (trong đó n <= 30
), thì thời gian chờ sau khi tải trọng sẽ là 30 - n
giây. Nếu phải mất nhiều hơn 30 giây, sau đó chu kỳ tiếp theo sẽ bị trì hoãn cho đến khi tải xong, nhưng không còn.
Bạn sẽ thấy rằng tôi có mã gỡ lỗi trong đó để bắt đầu trên ranh giới một phút để làm cho đầu ra ban đầu dễ theo dõi hơn. Tôi cũng tăng dần thời gian tải tối đa để cuối cùng bạn sẽ thấy tải trọng vượt quá thời gian chu kỳ 30 giây (một dòng trống bổ sung là đầu ra để có hiệu quả rõ ràng).
Một lần chạy mẫu tiếp theo (trong đó chu kỳ thường bắt đầu 30 giây sau chu kỳ trước):
Tue May 26 20:56:00 AWST 2020 Sleeping for 9 seconds (max 21).
Tue May 26 20:56:30 AWST 2020 Sleeping for 19 seconds (max 22).
Tue May 26 20:57:00 AWST 2020 Sleeping for 9 seconds (max 23).
Tue May 26 20:57:30 AWST 2020 Sleeping for 7 seconds (max 24).
Tue May 26 20:58:00 AWST 2020 Sleeping for 2 seconds (max 25).
Tue May 26 20:58:30 AWST 2020 Sleeping for 8 seconds (max 26).
Tue May 26 20:59:00 AWST 2020 Sleeping for 20 seconds (max 27).
Tue May 26 20:59:30 AWST 2020 Sleeping for 25 seconds (max 28).
Tue May 26 21:00:00 AWST 2020 Sleeping for 5 seconds (max 29).
Tue May 26 21:00:30 AWST 2020 Sleeping for 6 seconds (max 30).
Tue May 26 21:01:00 AWST 2020 Sleeping for 27 seconds (max 31).
Tue May 26 21:01:30 AWST 2020 Sleeping for 25 seconds (max 32).
Tue May 26 21:02:00 AWST 2020 Sleeping for 15 seconds (max 33).
Tue May 26 21:02:30 AWST 2020 Sleeping for 10 seconds (max 34).
Tue May 26 21:03:00 AWST 2020 Sleeping for 5 seconds (max 35).
Tue May 26 21:03:30 AWST 2020 Sleeping for 35 seconds (max 36).
Tue May 26 21:04:05 AWST 2020 Sleeping for 2 seconds (max 37).
Tue May 26 21:04:35 AWST 2020 Sleeping for 20 seconds (max 38).
Tue May 26 21:05:05 AWST 2020 Sleeping for 22 seconds (max 39).
Tue May 26 21:05:35 AWST 2020 Sleeping for 18 seconds (max 40).
Tue May 26 21:06:05 AWST 2020 Sleeping for 33 seconds (max 41).
Tue May 26 21:06:38 AWST 2020 Sleeping for 31 seconds (max 42).
Tue May 26 21:07:09 AWST 2020 Sleeping for 6 seconds (max 43).
Nếu bạn muốn tránh các giải pháp bùn, điều này có lẽ tốt hơn. Bạn vẫn sẽ cần một cron
công việc (hoặc tương đương) để phát hiện định kỳ nếu tập lệnh này đang chạy và nếu không, hãy khởi động nó. Nhưng chính kịch bản sau đó xử lý thời gian.
(a) Một số đồng nghiệp của tôi sẽ nói rằng bùn là đặc sản của tôi :-)