31 có nhất thiết ngụ ý cuối tháng trong một công việc định kỳ không?


13

Đối với công việc định kỳ, chúng tôi biết chúng tôi có thể đặt thời gian như dưới đây.

# +------------ Minute (0 - 59)
# | +---------- Hour (0 - 23)
# | | +-------- Day of the Month (1 - 31)
# | | | +------ Month (1 - 12)
# | | | | +---- Day of the Week (0 - 7) (Sunday is 0 or 7)
# | | | | |
# * * * * * command

Điều tôi muốn biết là khi chúng ta đặt ngày của tháng 31, điều này có nghĩa là kết thúc mỗi tháng mặc dù tháng không có ngày 31. Hy vọng sẽ có câu trả lời.

Cảm ơn trước

Câu trả lời:


22

Không, 31 có nghĩa là 31.

Tuy nhiên, bạn có thể làm một số mánh khóe. Đặt công việc để chạy vào bất kỳ ngày nào có khả năng là ngày cuối cùng của tháng (tức là 28-31 trong trường ngày), sau đó thay thế lệnh của bạn bằng biểu thức shell bao gồm một bài kiểm tra vào ngày bảo vệ chỉ huy:

0 0 28-31 * * [ "`date +%m`" != "`date --date=tomorrow +%m`" ] && command

Biểu thức bên trong dấu ngoặc chỉ hỏi xem số tháng hôm nay có khác với số tháng vào ngày mai không, điều này tất nhiên sẽ chỉ đúng vào ngày cuối cùng của tháng. Lưu ý rằng hình thức của biểu thức này phụ thuộc vào địa phương của bạn date- bạn có thể cần phải điều chỉnh nó nếu bạn không có phiên bản GNU hiện tại.

Tôi nên nói rằng tôi đã không phát minh ra điều này - tôi đã tìm thấy nó với một Google nhanh chóng trong một bài đăng danh sách gửi thư của Matthew Jarvis. Tuy nhiên, tôi sẽ tưởng tượng đây là một thủ thuật Unix tiêu chuẩn cũ.


1
Không thể quá cũ với một thủ thuật được đưa ra cho các tùy chọn dành riêng cho GNU thành "ngày" =)
jj33

4
Trên các trang web stackexchange, đặt câu hỏi có thể trả lời bằng tìm kiếm Google, KHÔNG phải là điều xấu. Trên thực tế, đó là một điều tốt, vì người tiếp theo sẽ tìm kiếm điều này trong Google sẽ tìm thấy câu trả lời trên stackexchange và đến đây.
miernik

12

Không, tôi nghĩ rằng điều tốt nhất bạn có thể làm là chạy vào nửa đêm vào ngày đầu tiên của tháng hoặc thiết lập các dòng crontab riêng lẻ cho mỗi tháng (hoặc ít nhất, một dòng trong nhiều tháng với 28,29,30 và 31 ngày)

0 0 28,29 2               * /my/command
0 0 30    4,6,9,11        * /my/command
0 0 31    1,3,5,7,8,10,12 * /my/command

Cảm ơn Paul! Tôi sẽ theo cái thứ hai. Đối với phương pháp thứ hai tôi có cần thiết lập cùng một tệp cho ba lần không? Cảm ơn một lần nữa :)

Vâng, bạn sẽ cần phải lặp lại nó.
Paul Dixon

7
Tôi không có kinh nghiệm với cron, nhưng sẽ không "0 0 28,29 2" thực hiện hai lần trong một năm nhuận? Không phải điều này sẽ là một vấn đề trong hai năm tới, nhưng vẫn ...
Wim ten Brink

Đó là một điểm tốt, không có cách nào dễ dàng để giải quyết
Paul Dixon

4

Tôi không nghĩ rằng bạn có thể làm điều này một cách dễ dàng trong crontab.

Một tùy chọn sẽ là thiết lập cronđể chạy tập lệnh mỗi ngày và sau đó tự kiểm tra tập lệnh nếu đó là ngày cuối cùng của tháng.


3

Tôi đoán cron có một ký tự đặc biệt 'L' có nghĩa cho mục đích này:

*    *    L    *    *    your_script.sh 

sẽ thực thi tập lệnh của bạn vào ngày cuối cùng hàng tháng

Mặt khác,

*    *    0    *    *    your_script.sh

Bạn thậm chí có thể chỉ định một cái gì đó như:

*    *    *    *    1,5L    your_scrript.sh

để chạy tập lệnh vào thứ Hai và thứ Sáu cuối cùng của mỗi tháng

hoặc là

*    *    *    *    1    your_script.sh

để chạy kịch bản vào mỗi thứ Hai lúc nửa đêm.


0

Điều này sẽ làm công việc:

if [ $( date +%-d --date="tomorrow" ) -eq 1 ]
then echo Last day of the current month
else echo Not yet!
     exit 0
fi

exit 1
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.