Tại sao công việc cron của tôi chạy trong tháng này?


31

Hôm nay là ngày 1 tháng 11 năm 2016 hoặc bằng số (không rõ ràng), 2016-11-01.

Tôi có một công việc định kỳ người dùng được thiết lập như thế này:

# m h  dom mon dow   command
33  3   1  */2  *    /home/user/...

Nó được cho là chạy mỗi tháng vào ngày đầu tiên của tháng lúc 3:33, bất kể đó là ngày nào trong tuần, nhưng vì một số lý do, nó đã được chạy ngày hôm nay, mặc dù 11 không chia hết cho 2.

Ai đó có thể giải thích cho tôi điều này? Là giả định của tôi về chia hết cho 2 sai?

EDIT: Tôi quên đề cập, tôi đang chạy cronphiên bản "3.0pl1-127 + deb8u1" trên máy Debian 8.6 "Jessie".



Vậy là bạn đang nói về ngày thứ 11 của tháng thứ 2016 của năm 1 rồi. :) (Thứ tự ngày phổ biến nhất ở Mỹ là tháng-năm-năm.)
gà con

@chicks kiểm tra lịch sử chỉnh sửa của câu hỏi này, ban đầu tôi sử dụng định dạng bạn đã đề cập ;-)
comfreak

@chicks bạn có nghĩa là tháng / ngày / năm?
dùng253751

@immibis Số ... comfreak: lol
gà con

Câu trả lời:


61

Đây /không phải là biểu thức số học, thay vào đó, nó mô tả "giá trị bước" trong phạm vi giá trị được phép . Vì vậy, vì các tháng luôn bắt đầu bằng 1thay vì 0, /2có nghĩa là "lấy mọi giá trị khác", dẫn đến (1, 3, 5, 7, 9, 11).

Điều này cũng được giải mã trong trang hướng dẫn, mặc dù điều này không phải là khủng khiếp rõ ràng và dễ hiểu:

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 với "<number>" chỉ định bỏ qua giá trị của số đó thông qua 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 mỗi giờ (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 "cứ sau hai giờ", chỉ cần sử dụng "* / 2".


2
Cảm ơn câu trả lời của bạn, tôi chỉ nhận ra điều này sau khi đọc lại trang nam và làm việc này trong đầu. Tôi thường chỉ làm việc với các công việc định kỳ ngắn hạn trong đó các số bắt đầu bằng 0 và giả định của tôi thực sự có ý nghĩa theo một cách nào đó.
comfreak

18
Tôi chỉ suy nghĩ tại sao câu hỏi này không được hỏi thường xuyên hơn và đi đến cùng một kết luận: Bởi vì rất ít người điều hành công việc với bất cứ thứ gì sau đó là "*" trong trường tháng.
Sven

Một câu hỏi, điều gì sẽ xảy ra nếu số không chia, ví dụ */5? Nó sẽ là 1,6,11,1,6 ... hay sẽ là 1,6,11,4,9 ...? Tôi giả định rằng "vượt quá phạm vi giá trị được phép" có nghĩa là nó không có bộ nhớ, nhưng bây giờ tôi không chắc về điều đó.
MariusSiuram

@MariusSiuram: Biến thể đầu tiên. Một lần nữa, đây không phải là một hoạt động số học. crondchỉ cần lấy danh sách các giá trị có thể, áp dụng bộ chọn bước một lần và sau đó sử dụng các kết quả này nhiều lần.
Sven

4

Hôm nay là ngày đầu tiên của tháng 11.

* / 2 có nghĩa là cronjob của bạn sẽ thực hiện mỗi tháng như bạn nói.

Vì vậy, vào tháng tới (tháng 12), cronjob sẽ không được thực thi, mà là tháng (tháng 1) sau đó.

Tháng trước tháng này (tháng 10), cronjob đã không được thực hiện. Nhưng vào tháng 9 thì được.


1
Vì vậy, bạn nghĩ rằng */2trong trường tháng là tương đương 1-11/2, chứ không phải 2-12/2. Tôi không nói bạn sai, nhưng bạn có thể tạo bất kỳ tài liệu hỗ trợ nào không?
MadHatter hỗ trợ Monica

@MadHatter Sven đã giải thích điều đó tốt.
Trẻ mồ côi

1
Tôi đồng ý, và tốt nhất của tất cả các ông trích dẫn các nguồn có thẩm quyền.
MadHatter hỗ trợ Monica

2
Chỉ cần chỉ ra, tháng 9 trước tháng 10, và không phải tháng 8 ;-)
hjpotter92
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.