Công cụ dành cho nhà phát triển · Trình tạo Crontab
Ngày trong tháng và ngày trong tuần trong cron: quy tắc OR khiến mọi người ngạc nhiên
· Cách thức hoạt động
cron lịch lập kế hoạch
Khi cả hai trường ngày đều bị hạn chế, cron sẽ chạy công việc nếu một trong hai trường khớp. Bài đăng này giải thích quy tắc từ crontab(5), tại sao nó tồn tại và cách lấy lịch trình mà nó ngăn chặn.
Báo cáo chạy vào ngày đầu tiên và thứ Hai hàng tuần — biểu thức 0 9 1 * 1 không có nghĩa là nó trông như thế nào
Một biểu thức như `0 9 1 * 1` trông giống như “09:00 vào Thứ Hai đầu tiên” nếu cột hai ngày được đọc dưới dạng bộ lọc tích lũy. ToolAcre không đọc theo cách đó. Với ngày trong tháng được đặt thành 1 và ngày trong tuần được đặt thành Thứ Hai, trình phân tích cú pháp cảnh báo rằng một trong hai điều kiện có thể khớp nhau, do đó lịch trình bao gồm các ngày đầu tiên và thứ Hai hàng tuần.
Đây không phải là một sở thích từ ngữ nhỏ. Báo cáo hàng tháng có thể chạy thêm bốn hoặc năm lần và một hoạt động dự kiến chỉ vào thứ Hai cũng có thể chạy vào ngày đầu tiên của tháng. Trình tạo đặt cảnh báo “Đáng kiểm tra” bên cạnh mô tả để hiển thị hành vi mở rộng trước khi một biểu thức được sao chép vào crontab bên ngoài.
Quy tắc như đã viết - nếu cả ngày trong tháng và ngày trong tuần đều bị hạn chế, lệnh sẽ chạy khi một trong hai trường khớp với nhau
Hàm `dayMatches` của quá trình triển khai xử lý rõ ràng bốn trường hợp. Hai ký tự đại diện chấp nhận mỗi ngày; ngày trong tháng có ký tự đại diện sẽ chuyển sang ngày trong tuần; ký tự đại diện ngày trong tuần được tính theo ngày trong tháng; và hai trường bị hạn chế trả về logic OR của kết quả khớp của chúng. Các bài kiểm tra bao gồm một ngày chỉ khớp với ngày thứ mười ba, chỉ thứ Sáu và không có điều kiện nào.
Mô tả bảo tồn quy tắc tương tự. `0 0 13 * 5` được hiển thị bằng “vào ngày 13 của tháng hoặc vào thứ Sáu”, không phải là một từ kết hợp mơ hồ. Phân tích cú pháp, lựa chọn lần chạy tiếp theo và đầu ra tiếng Anh đều sử dụng cùng một cách giải thích. Hành vi được chia sẻ đó là bằng chứng mạnh mẽ hơn một nhãn trợ giúp riêng biệt vì sự bất đồng giữa các đường dẫn đó sẽ ngay lập tức tạo ra các bản xem trước sai lệch.
Trình phân tích cú pháp thực hiện OR và đưa ra hậu quả; nó không thiết lập lịch sử của quy tắc
Bản phác thảo sổ làm việc đưa ra lý do lịch sử cho thiết kế OR, nhưng kho lưu trữ này chứng minh hành vi chứ không phải nguồn gốc. Nhận xét mã xác định quy tắc kiểu Vixie và các thử nghiệm thiết lập kết quả được mô hình hóa bởi ToolAcre. Họ không ghi lại ai đã chọn quy tắc này, khi nào nó được thông qua hoặc tại sao cách giải thích dễ dãi lại được ưu tiên hơn.
Giữ ranh giới đó là vấn đề quan trọng trong văn bản kỹ thuật. Người đọc cần biết chính xác công cụ này mở rộng biểu thức như thế nào; họ không cần một bản tường thuật tiêu chuẩn được phát minh để sử dụng nó một cách an toàn. Nếu mục tiêu triển khai ghi lại ngữ nghĩa theo ngày khác nhau thì hướng dẫn sử dụng của mục tiêu đó sẽ xếp hạng cao hơn bản xem trước trình duyệt này. ToolAcre nêu phương ngữ mà nó tính toán thay vì tuyên bố mọi người lập lịch đều đồng ý.
Ví dụ hoạt động: liệt kê 0 9 1 * 1 trong một tháng — những ngày nó kích hoạt, so với lịch trình mà tác giả mong muốn
Hãy xem xét một tháng có ngày đầu tiên không phải là thứ Hai. `0 9 1 * 1` tạo một lượt chạy trong lượt chạy đầu tiên và lượt chạy bổ sung vào thứ Hai hàng tuần. Nếu ngày đầu tiên là Thứ Hai thì ngày đó vẫn xuất hiện một lần vì tìm kiếm ở lần chạy tiếp theo sẽ xem xét một phút theo lịch chứ không phải hai trình kích hoạt riêng biệt. Công đoàn thay đổi kích thước theo lịch nhưng không theo logic.
Bạn có thể kiểm tra sự kết hợp đó bằng cách chọn múi giờ và đọc năm lần chạy tiếp theo. Bản xem trước bắt đầu ngay sau thời điểm hiện tại và tìm kiếm ngày theo lịch, áp dụng các trường tháng, ngày và giờ. Nó không hứa hẹn một tháng cụ thể trong văn xuôi bài viết vì danh sách trực tiếp phụ thuộc vào thời điểm và địa điểm mà người đọc thực hiện kiểm tra.
Cách giải quyết lệnh thứ Hai đầu tiên theo kiểu AND nằm ngoài trình tạo lịch trình này
Kế hoạch đề xuất nhúng thử nghiệm ngày shell để đạt được hành vi AND. ToolAcre không thể xác minh lệnh như vậy: nó chỉ chấp nhận năm trường lịch trình và dòng đầy đủ được sao chép của nó chứa tệp thực thi giữ chỗ. Cú pháp Shell, phần trăm thoát, tính khả dụng của lệnh và hành vi thoát đều thuộc về môi trường cuối cùng sẽ chạy công việc.
Trong trình tạo này, bước thiết kế an toàn là để lại trường một ngày dưới dạng `*` trừ khi kết hợp OR thực sự có ý định. Đối với yêu cầu vào thứ Hai đầu tiên, hãy ghi lại rằng chỉ riêng cron năm trường không thể hiện giao điểm trong phương ngữ này. Chọn và thử nghiệm một giải pháp dành riêng cho từng môi trường một cách riêng biệt thay vì hiển thị đoạn mã chưa được thực thi như được đảm bảo.
Các toán tử lập lịch khác không được trình phân tích cú pháp năm trường này giải thích
Một số ngữ pháp của trình lập lịch trình hiển thị các toán tử như `#`, `L`, `W` hoặc `?`, nhưng trình phân tích cú pháp này không chấp nhận toán tử nào trong số đó. Nó cũng từ chối sáu trường và giải thích rằng hợp đồng của nó là cú pháp crontab gồm năm trường. Do đó, một biểu thức hoạt động trong một sản phẩm khác không thể được dán vào đây để làm bằng chứng cho thấy quy tắc lịch tương tự tồn tại.
Bản dịch phương ngữ bắt đầu bằng cách xác định ngữ pháp nguồn và đích chứ không phải bằng cách xóa dấu câu cho đến khi xác thực thành công. ToolAcre có thể giúp xây dựng năm trường, tên, phạm vi, danh sách và các bước thông thường của mục tiêu. Nó không thể bảo toàn ngữ nghĩa được thực hiện bởi một toán tử không được hỗ trợ và các bài viết cố tình tránh mô tả những toán tử nước ngoài đó như thể chúng đã được triển khai.
Lệnh thoát nằm ngoài ngữ pháp chỉ biểu thức
Dấu phần trăm và trích dẫn lệnh xuất hiện sau lịch trình và nằm ngoài `parseCron`. Trình phân tích cú pháp chia một biểu thức thành chính xác năm phần được phân tách bằng khoảng trắng; nó không bao giờ đọc đường dẫn shell, lệnh ngày hoặc tải trọng lệnh thoát. Do đó, bài viết này không hướng dẫn cách giải quyết bằng dấu phần trăm mặc dù sách bài tập đã đề xuất cách giải quyết đó.
Sự thiếu sót đó là một quyết định đúng đắn. Công cụ lập lịch không được ngụ ý rằng lệnh là an toàn vì các trường thời gian của nó được xác thực. Xem lại cú pháp lệnh trong quá trình triển khai cron và shell thực tế, với đầu vào vô hại và đầu ra có thể quan sát được. Giữ kết quả của trình tạo trong phạm vi quy tắc lịch mà nó hiểu rõ ràng.
Bài học rút ra: hạn chế trường một ngày, không phải cả hai - và phần giải thích của trình tạo sẽ hiển thị OR trước khi bạn lưu dòng
Khi cả hai trường ngày đều bị hạn chế, hãy đọc chúng như một sự kết hợp và nói to “hoặc”. Tốt hơn hết, hãy kiểm tra cảnh báo của trình tạo và các lần chạy sắp tới. Nếu những ngày đó vượt quá dự định, hãy trả lại một trường cho `*` và giải quyết mọi yêu cầu chuyên biệt hơn bằng cơ chế được môi trường đích ghi lại.
Bài học cốt lõi không phải là cron bí ẩn; đó là hai cột liền kề không kết hợp với nhau như những hạn chế khác. ToolAcre tập trung ngoại lệ đó vào logic phân tích cú pháp, mô tả và xem trước. Sử dụng ba chế độ xem đó để phát hiện sự không khớp trước khi một biểu thức rời khỏi trình duyệt và trở thành lịch hoạt động.