Có thể chạy cronjob ba ngày một lần không? Hoặc có thể 10 lần / tháng.
Có thể chạy cronjob ba ngày một lần không? Hoặc có thể 10 lần / tháng.
Câu trả lời:
Chạy nó ba ngày một lần ...
0 0 */3 * *
Làm thế nào về điều đó?
Nếu bạn muốn nó chạy vào những ngày cụ thể trong tháng, như ngày 1, 4, 7, v.v. thì bạn chỉ cần có một điều kiện trong tập lệnh của mình để kiểm tra ngày hiện tại trong tháng.
if (((date('j') - 1) % 3))
exit();
hoặc, như @mario đã chỉ ra, bạn có thể sử dụng date ('k') để lấy ngày trong năm thay vì dựa trên ngày trong tháng.
0 0 */3 * *
nghĩa là chạy vào mùng 1, mùng 4, mùng 7,… ( */3
có 1-31/3
nghĩa là 1,4,7...31
) nên khoảng cách sẽ nhỏ hơn vào cuối tháng. (Nó sẽ chạy 2 ngày liên tiếp nếu tháng trước đó có 31 ngày.) Có date('j') % 3
một vấn đề tương tự là mẫu khởi động lại hàng năm và các năm không có số ngày chia hết cho 3.
* * */3 * * that says, every minute of every hour on every three days.
0 0 */3 * * says at 00:00 (midnight) every three days.
Tôi không phải là một chuyên gia cron, nhưng làm thế nào về:
0 */72 * * *
Nó sẽ chạy mỗi 72 giờ không bị gián đoạn.
then at 2019-02-28 00:00:00 then at 2019-03-01 00:00:00
Bởi vì cron là "không trạng thái", nó không thể biểu thị chính xác "tần số", chỉ có những "mẫu" mà nó (dường như) liên tục khớp với thời gian hiện tại.
Diễn đạt lại câu hỏi của bạn làm cho điều này rõ ràng hơn: "có thể chạy cronjob lúc 00:01 sáng mỗi đêm trừ những đêm bỏ qua khi nó đã chạy trong vòng 2 đêm không?" Khi cron đang so sánh thời gian hiện tại với các mẫu thời gian yêu cầu công việc, không có cách nào cron có thể biết liệu nó có chạy công việc của bạn trong quá khứ hay không.
Thông thường, bạn phải chấm dứt sự kiện lặp lại đó và khởi động lại một sự kiện hoàn toàn mới; điều này minh họa mức độ diễn đạt hạn chế về cách các ứng dụng lịch thậm chí phức tạp thể hiện các mẫu lặp lại. Và tất nhiên Lịch có rất nhiều trạng thái - mỗi sự kiện riêng lẻ có thể bị xóa hoặc lên lịch lại một cách độc lập [trong hầu hết các ứng dụng lịch]).
Hơn nữa, bạn có thể muốn thực hiện công việc của mình vào mỗi đêm thứ 3 nếu thành công , nhưng nếu lần cuối cùng không thành công, hãy thử lại ngay lập tức, có thể là vào đêm tiếp theo (không phải đợi 3 ngày nữa) hoặc thậm chí sớm hơn, chẳng hạn như một giờ sau (nhưng dừng thử lại khi đến vào buổi sáng). Rõ ràng, cron không thể biết liệu công việc của bạn có thành công hay không và mẫu cũng không thể thể hiện lịch trình "thử lại" thường xuyên hơn.
MỌI LÚC - Bạn có thể tự mình làm những gì bạn muốn. Viết một kịch bản, yêu cầu cron chạy nó hàng đêm lúc 00:01 sáng. Tập lệnh này có thể kiểm tra dấu thời gian của thứ gì đó * ghi lại "lần chạy cuối cùng" và nếu cách đây> 3 ngày **, hãy thực hiện công việc và đặt lại dấu thời gian "lần chạy cuối cùng".
(* chỉ báo có dấu thời gian đó là một chút trạng thái tồn tại mà bạn có thể thao tác và kiểm tra, nhưng cron không thể)
** hãy cẩn thận với số học thời gian nếu bạn đang sử dụng đồng hồ có thể đọc được của con người - hai lần một năm, một số ngày có 23 hoặc 25 giờ trong ngày và 02: 00-02: 59 xảy ra hai lần trong một ngày hoặc không vào lúc tất cả. Sử dụng UTC để tránh điều này.
0 0 1-30/3 * *
Điều này sẽ chạy ba ngày một lần bắt đầu từ ngày 1. Đây là 20 lần chạy theo lịch trình -
Tôi không nghĩ rằng bạn có những gì bạn cần với:
0 0 */3 * * ## <<< WARNING!!! CAUSES UNEVEN INTERVALS AT END OF MONTH!!
Thật không may, * / 3 là thiết lập khoảng thời gian trên mỗi ngày n tháng và không mỗi n ngày . Xem: giải thích tại đây . Vào cuối tháng, vấn đề định kỳ được đảm bảo.
1st at 2019-02-01 00:00:00
then at 2019-02-04 00:00:00 << 3 days, etc. OK
then at 2019-02-07 00:00:00
...
then at 2019-02-25 00:00:00
then at 2019-01-28 00:00:00
then at 2019-03-01 00:00:00 << 1 day WRONG
then at 2019-03-04 00:00:00
...
Theo bài viết này , bạn cần thêm một số toán học modulo vào lệnh đang được thực thi để có được ĐÚNG "N ngày một lần". Ví dụ:
0 0 * * * bash -c '(( $(date +\%s) / 86400 \% 3 == 0 )) && runmyjob.sh
Trong ví dụ này, công việc sẽ được kiểm tra hàng ngày lúc 12:00 sáng, nhưng sẽ chỉ thực hiện khi số ngày kể từ 01-01-1970 modulo 3 là 0.
Nếu bạn muốn đó là 3 ngày một lần kể từ một ngày cụ thể, hãy sử dụng định dạng sau:
0 0 * * * bash -c '(( $(date +\%s -d "2019-01-01") / 86400 \% 3 == 0 )) && runmyjob.sh
Làm thế nào về:
00 00 * * * every 3 days && echo test
Trong trường hợp every
là một kịch bản:
#!/bin/sh
case $2 in
days)
expr `date +%j` % $1 = 0 > /dev/null
;;
weeks)
expr `date +%V` % $1 = 0 > /dev/null
;;
months)
expr `date +%m` % $1 = 0 > /dev/null
;;
esac
Vì vậy, nó chạy mỗi ngày.
Sử dụng */3
chạy vào các ngày 3, 6, ... 27, 30 của tháng, nhưng sau đó bị sai sau một tháng có ngày thứ 31. Các every
kịch bản chỉ là sai sau khi kết thúc năm.
Bạn nên tìm hiểu những điều cơ bản về crontab
.
Chỉnh sửa cron bằng lệnh crontab -e
, sau đó nhấn ⌃ (CTRL)+ Xsau đó Yvà cuối cùng nhấn ENTER (return)trên mac để lưu tệp. Bạn có thể kiểm tra xem các cây trồng mới đã được cài đặt chưa bởicrontab -l
Tệp crontab có năm trường để chỉ định phút, giờ, ngày trong tháng, tháng và ngày trong tuần, theo sau là lệnh sẽ được chạy trong khoảng thời gian đó.
* * * * * command to be executed
- - - - -
| | | | |
| | | | +----- day of week (0-6) (Sunday=0)
| | | +------- month (1-12)
| | +--------- day of month (1-31)
| +----------- hour (0-23)
+------------- min (0-59)
*
trong trường giá trị ở trên có nghĩa là tất cả các giá trị pháp lý như trong dấu ngoặc nhọn cho cột đó.
Ở đây, tôi đã viết một bài chi tiết về nó: Thiết lập Cron trong Unix
Nếu bạn muốn nó chạy vào những ngày cụ thể trong tháng, như ngày 1, 4, 7, v.v. thì bạn chỉ cần có một điều kiện trong tập lệnh của mình để kiểm tra ngày hiện tại trong tháng.
Tôi nghĩ tất cả những gì bạn cần cho việc này là thay vì * / 3 có nghĩa là ba ngày một lần, hãy sử dụng 1/3 có nghĩa là ba ngày một lần bắt đầu từ ngày 1 của tháng. vì vậy 7/3 có nghĩa là ba ngày một lần bắt đầu từ ngày 7 của tháng, v.v.
0 0 * * * [ $(($((
ngày +% - j- 1)) % 3)) == 0 ] && script
Lấy ngày trong năm từ đó date
, bù với 1 để bắt đầu bằng 0, kiểm tra xem nó có phải là modulo ba hay không.
( 365-1 ) % 3 == 1
nhưng ( 1 - 1 ) % 3 == 0
? Tôi nghĩ rằng phép tính tốt hơn sẽ dựa trên số ngày kể từ Kỷ nguyên Unix.