Cron đã cho phép nhân vật đặc biệt Cướp LÊ cho Nhận ngày cuối tháng của tháng trên Debian


8

Tôi muốn biết liệu Lcó phải là một trong những ký tự đặc biệt được phép khi triển khai cron của Debian không? Tôi đang cố gắng thiết lập một cron để chạy vào ngày cuối cùng hàng tháng.

Từ mục cron trên wikipedia :

'L' là viết tắt của "cuối cùng". Khi được sử dụng trong trường ngày trong tuần, nó cho phép bạn chỉ định các cấu trúc như "Thứ Sáu tuần trước" ("5L") của một tháng nhất định. Trong trường ngày, nó chỉ định ngày cuối cùng của tháng.

Lưu ý: L là một ký tự không chuẩn và chỉ tồn tại trong một số triển khai cron (trình lập lịch biểu của Quartz java)

Nếu không, làm thế nào bạn có thể thiết lập một cron để chạy vào ngày cuối cùng của mỗi tháng? Bạn có đề xuất 3 mục khác nhau như giải pháp này trên stackoverflow không?

Câu trả lời:


6

Các mục cron trên Debian được mô tả trong trang man crontab ( man 5 crontab). Debian sử dụng cron của Vixie và trang người đàn ông của anh ta nói:

   The crontab syntax does not make it possible  to  define  all  possible
   periods  one could image off. For example, it is not straightforward to
   define the last weekday of a month. If a task needs to be run in a spe-
   cific  period of time that cannot be defined in the crontab syntaxs the
   best approach would be to have the program itself check  the  date  and
   time  information and continue execution only if the period matches the
   desired one.

   If the program itself cannot do the checks then a wrapper script  would
   be required. Useful tools that could be used for date analysis are ncal
   or calendar For example, to run a program the last  Saturday  of  every
   month you could use the following wrapper code:

   0 4 * * Sat   [ "$(date +%e)" = "`ncal | grep $(date +%a | sed  -e 's/.$//') 
     | sed -e 's/^.*\s\([0-9]\+\)\s*$/\1/'`" ] && echo "Last Saturday" &&
     program_to_run

Vì vậy, làm việc theo các dòng:

   0 0 * * * perl -MTime::Local -e 
       'exit 1 if (((localtime(time()+60*60*24))[3]) < 2);' || program_to_run

4

Tôi chưa bao giờ thấy điều đó Lkhi triển khai cron Linux.

Để chạy một công việc vào ngày cuối cùng của tháng, hãy chạy nó vào một siêu ngày của những ngày thực tế và kiểm tra ngày của ngày hôm sau. Với GNU date, bạn có thể sử dụng date -d tomorrowđể hiển thị ngày hôm sau, vì vậy hãy kiểm tra xem liệu nó có còn trong cùng tháng không. Để tránh sự cố ở một vài địa điểm vào một ngày khi thời gian tiết kiệm ánh sáng ban ngày bắt đầu hoặc kết thúc, hãy chỉ định thời gian trong ngày không phải là nửa đêm của buổi sáng (ví dụ 12: 00 / trưa). Hãy nhớ rằng đó %là đặc biệt trong một crontab và cần được bảo vệ bằng dấu gạch chéo ngược.

42 1 28-31 * * if [ "$(date -d 'today 12:00' +\%m)" != "$(date -d 'tomorrow 12:00' +\%m)" ]; then last_day_of_month_job; fi

Bạn có thể áp dụng kỹ thuật tương tự cho lần xuất hiện cuối cùng của một ngày cụ thể trong tuần trong tháng. Chạy công việc hàng tuần và chỉ kích hoạt nó nếu lần xuất hiện tiếp theo sẽ diễn ra trong một tháng khác.

42 1 * * 3 if [ "$(date -d 'today 12:00' +\%m)" != "$(date -d 'now + 7 days 12:00' +\%m)" ]; then last_wednesday_of_month_job; fi

2

Tôi đoán là hơi khó xử khi kiểm tra điều này bằng thực nghiệm, vì điều đó sẽ yêu cầu thay đổi đồng hồ của bạn.

Debian sử dụng triển khai cron vixie , được đề cập trong bài viết trên wikipedia. Định dạng cho các biểu thức crontab được giải thích man 5 crontab, hơi khó, vì man crontabkhông giống nhau (phần 1 mặc định là lệnh crontab, phần 5 dành cho định dạng của tệp "crontab").

Nó không đề cập đến 'L'.

WRT các lựa chọn thay thế từ SO, câu trả lời được kiểm tra là dễ theo dõi nhất và không yêu cầu tập lệnh bên ngoài, v.v. OTOH, nó có vấn đề năm nhuận ...


Đúng, bạn có thể sử dụng danh sách vào ngày 28,29 nhưng sau đó bạn sẽ nhận được 2 lần chạy trong một năm nhuận :(
Drav Sloan

0

Kịch bản của tôi có tính năng đó, nó không phải là cron gốc nhưng sẽ thực hiện thủ thuật.

http://xr09.github.io/cron-last-sunday/

Ví dụ:

# every last sunday
30 6 * * 7 root run-if-today L && /root/myscript.sh

# every third tuesday
30 6 * * 2 root run-if-today 3 && /root/myscript.sh
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.