Điểm:1

Bắt đầu công việc định kỳ từ 06:05 đến 22:05 cứ sau 15 phút

lá cờ cn

Tôi cần chạy một công việc định kỳ cứ sau 15 phút bắt đầu lúc 06:05 và kết thúc lúc 22:05.

0 5/15 6-22 * * *

Cú pháp sau bao gồm 22:35 và 22:50.

Bất kỳ ý tưởng làm thế nào để đạt được điều này? Điều này có thể thực hiện được với một dòng hay tôi cần phải định cấu hình nhiều dòng?

Kernel Stearns avatar
lá cờ de
Đây là một loại khó khăn, nhưng bản năng ruột thịt của tôi là thêm một cronjob chạy ở 0605, thêm một cronjob khác chạy những gì bạn muốn cứ sau 15 phút. Sau đó, thêm một công việc định kỳ cuối cùng để xóa công việc định kỳ phụ tại 2205.
Điểm:4
lá cờ pe

âCron Job" của xmodulo được cấp phép theo CC BY 2.0

*/15 6-22 * * * /path/to/script

HOẶC

5,20,35,50 6-22 * * * /path/to/script

Một trường có thể là dấu hoa thị (*), luôn là viết tắt của "first-last". Phạm vi số được cho phép. Phạm vi là hai số được phân tách bằng dấu gạch nối. Phạm vi được chỉ định là bao gồm. Ví dụ: 8-11 cho mục nhập "giờ" chỉ định thực thi vào giờ 8, 9, 10 và 11.

Danh sách được phép. Danh sách là một tập hợp các số (hoặc phạm vi) được phân tách bằng dấu phẩy. Ví dụ: "1,2,5,9", "0-4,8-12".

Giá trị bước có thể được sử dụng kết hợp với phạm vi.Theo sau một phạm vi có "" chỉ định bỏ qua giá trị của số trong phạm vi. Ví dụ: "0-23/2" có thể được sử dụng trong trường giờ để chỉ định thực thi lệnh cách mỗi giờ (lựa chọn thay thế trong tiêu chuẩn V7 là "0,2,4,6,8,10,12,14,16 ,18,20,22"). Các bước cũng được cho phép sau dấu hoa thị, vì vậy nếu bạn muốn nói "hai giờ một lần", chỉ cần sử dụng "*/2".

Tên cũng có thể được sử dụng cho các trường "tháng" và "ngày trong tuần". Sử dụng ba chữ cái đầu tiên của ngày hoặc tháng cụ thể (không quan trọng chữ thường). Phạm vi hoặc danh sách tên không được phép.

Trường "thứ sáu" (phần còn lại của dòng) chỉ định lệnh sẽ được chạy. Toàn bộ phần lệnh của dòng, cho đến ký tự xuống dòng hoặc %, sẽ được thực thi bởi /bin/sh hoặc bởi shell được chỉ định trong biến SHELL của cronfile. Dấu phần trăm (%) trong lệnh, trừ khi được thoát bằng dấu gạch chéo ngược (), sẽ được thay đổi thành ký tự dòng mới và tất cả dữ liệu sau % đầu tiên sẽ được gửi tới lệnh dưới dạng đầu vào tiêu chuẩn.

Lưu ý: Ngày thực thi lệnh có thể được chỉ định bởi hai trường - ngày trong tháng và ngày trong tuần. Nếu cả hai trường đều bị hạn chế (nghĩa là không *), lệnh sẽ được chạy khi một trong hai trường khớp với thời gian hiện tại. Ví dụ, "30 4 1,15 * 5" sẽ khiến một lệnh được chạy vào lúc 4:30 sáng vào ngày 1 và 15 hàng tháng, cộng với mỗi thứ Sáu.

Gerrit avatar
lá cờ cn
5,20,35,50 6-23 * * * Có phải chạy nhiều hơn thì bị hỏi phải không?
Arden Smith avatar
lá cờ pe
Tôi đã cập nhật câu trả lời của mình ngay bây giờ
Gerrit avatar
lá cờ cn
Nhưng điều này vẫn sẽ chạy vào 22:20, 22:35 và 22:50 ngoài thời gian mà người đăng yêu cầu.
Gerrit avatar
lá cờ cn
Cũng có thể sử dụng nhiều dòng SHELL= trong tệp cron. Mỗi dòng SHELL sẽ áp dụng cho các dòng tiếp theo cho đến khi có một dòng SHELL= khác. Tương tự cho cài đặt env.
Điểm:3
lá cờ fr

Cá nhân tôi sẽ chia nó thành hai dòng:

5-50/15 6-21 * * * /path/to/script
5 22 * ​​* * /đường dẫn/đến/tập lệnh

Dòng đầu tiên bao gồm 0605-2150, dòng thứ hai - để chạy bổ sung tại 2205.

Nếu bạn thực sự muốn có một lớp lót, tôi sẽ kiểm tra không chính xác để xác định thời gian bắt đầu công việc không chính xác có thể xảy ra:

5-50/15 6-22 * * * [[ $(date +"\%-H\%M") -le 2210 ]] && /path/to/script
Gerrit avatar
lá cờ cn
Trình xác định trường "-" ở định dạng ngày tháng để tránh hệ bát phân là một bước ngoặt thú vị. Điều đáng nói là ở bên phải của -le, bạn cũng không nên đặt các giá trị như 0630, vì chúng sẽ được hiểu là bát phân.
Điểm:1
lá cờ cn

Có thể với một croline nhưng chỉ với các thủ thuật

SHELL=/bin/bash
5-50/15 6-22 * * * [[ '2220 2235 2250' =~ "$(date +\%H\%M)" ]] || /đường dẫn/đến/tập lệnh

Hoặc với sh (và bash)

VỎ =/bin/sh
5-50/15 6-22 * * * trường hợp "$(date +\%H\%M)" vào năm 2220|2235|2250) ;; *) /path/to/script;;esac

Lưu ý dấu gạch chéo ngược thoát cho phần trăm (%) ký tự, cần thiết cho crontab.

Điểm:1
lá cờ cn
Bob

Tôi là người ủng hộ mạnh mẽ việc giữ mọi thứ đơn giản.

Như bạn có thể thấy từ các câu trả lời khác, việc lập lịch trình phức tạp hơn một chút với mục nhập cron duy nhất có thể, nhưng dẫn đến các mục cron mà bạn cần xem hai lần để hiểu.

Tôi sẽ cố gắng tránh điều đó và làm như sau:

# .---------------- phút (0 - 59)
# | .-----------giờ (0 - 23)
# | | .----------- ngày trong tháng (1 - 31)
# | | | .------- tháng (1 - 12) 
# | | | | .---- ngày trong tuần (0 - 6) (Chủ Nhật=0 hoặc 7) 
# | | | | |
# * * * * * lệnh được thực thi

# chạy my_batch cứ sau 15 phút bắt đầu lúc 06:05 và kết thúc 22:05 (trường hợp góc) 

15/5 6-21 * * * my_batch
5 22 * ​​* * my_batch

Khi lịch trình của bạn thậm chí còn phức tạp hơn và không phù hợp để khai báo trong một lịch trình cron đơn giản, giải pháp ưa thích của tôi là xây dựng logic vào chính công việc hàng loạt (hoặc trình bao bọc xung quanh công việc hàng loạt).

Sau đó, bạn có toàn bộ sức mạnh của ngôn ngữ kịch bản ưa thích của mình để kiểm tra xem tất cả các điều kiện có phù hợp để thực thi công việc hàng loạt hay không hoặc bạn thoát (có hoặc không có lỗi) khi chúng không phù hợp.

# chạy my_batch_wrapper 15 phút một lần 

15/5 * * * * my_batch_wrapper

và trong mã giả my_batch_wrapper

   # không chạy my_batch trước 06:05 hoặc sau 22:05 

   nếu [ bây giờ() < 06:05 ] ; thoát 0 

   nếu [ bây giờ() > 22:06 ] ; thoát 0 

  
   /đường dẫn/đến/my_batch 

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.