2010-12-28 65 views

Trả lời

67

Run nó mỗi ba ngày ...

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ó thể có điều kiện trong tập lệnh để kiểm tra ngày hiện tại của tháng.

if (((date('j') - 1) % 3)) 
    exit(); 

hoặc, @mario chỉ ra, bạn có thể sử dụng ngày ('k') để nhận ngày trong năm thay vì thực hiện dựa vào ngày trong tháng.

+0

có thể ... không biết tôi đang hỏi bạn ... lol – tmartin314

+4

@whatshakin: Nó sẽ tùy thuộc vào độ chính xác mà bạn muốn "mỗi ba ngày". Điều này sẽ làm việc vào bất kỳ ngày nào có thể chia hết cho 3. Trên các ranh giới tháng, nó sẽ không chính xác. – David

+3

@whatshakin: Cú pháp cronjob thậm chí được mô tả trên Wikipedia: http://en.wikipedia.org/wiki/Cronjob –

1

Sẽ đơn giản hơn nếu bạn định cấu hình để chỉ chạy, ví dụ: vào thứ hai và thứ năm, mà sẽ cho nó nghỉ 3 và 4 ngày.

Nếu không cấu hình nó để chạy hàng ngày, nhưng chắc php cron script thoát sớm với:

if (! (date("z") % 3)) { 
    exit; 
} 
47
* * */3 * * that says, every minute of every hour on every three days. 

0 0 */3 * * says at 00:00 (midnight) every three days. 
+0

đánh giá cao sự giải thích – pythonian29033

+1

Điều này thường sẽ kích hoạt ba ngày một lần, nhưng có thể kích hoạt vào ngày tiếp theo vào đầu tháng – Dziamid

9

Vì cron là "quốc tịch", nó không thể diễn tả một cách chính xác "tần số", chỉ có "mẫu" mà nó (dường như) liên tục phù hợp với thời gian hiện tại.

Làm cho câu hỏi của bạn trở nên rõ ràng hơn: "có thể chạy cronjob lúc 00:01 sáng mỗi đêm trừ đêm bỏ qua khi nó chạy trong vòng 2 đêm không?" Khi cron 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 nếu nó chạy công việc của bạn trong quá khứ.

(chắc chắn có thể viết một cron trạng thái ghi lại các công việc trước đây và do đó bao gồm các mẫu để khớp với trạng thái này, nhưng đó không phải là cron chuẩn được bao gồm trong hầu hết các hệ điều hành. Ví dụ, là mô hình thiết lập lại khi thời gian được thay đổi (tức là mục nhập crontab được sửa đổi)? Hãy nhìn vào ứng dụng lịch yêu thích của bạn để xem nó phức tạp như thế nào để có thể thể hiện các mẫu lặp lại của các sự kiện đã lên lịch và lưu ý rằng chúng không có sự cố đặt lại vì sự kiện lịch bắt đầu có ngày "bắt đầu" tự nhiên "/ k/a" đặt lại. Hãy thử lên lịch lại sự kiện lịch lặp lại mỗi tuần một lần để trì hoãn bởi Ví dụ, 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 cho li sự biểu thị được trích dẫn về cách các ứng dụng lịch phức tạp thậm chí đại diện cho các mẫu lặp lại. Và tất nhiên Lịch có nhiều trạng thái-- mỗi sự kiện riêng lẻ có thể bị xóa hoặc được lên lịch lại độ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 mỗi đêm thứ 3 nếu thành công, nhưng nếu lần cuối không thành công, hãy thử lại ngay lập tức, có thể là đêm tiếp theo (không đợi thêm 3 ngày nữa) hoặc thậm chí sớm hơn một giờ sau đó (nhưng dừng lại khi đến vào buổi sáng). Rõ ràng, cron không thể biết được liệu công việc của bạn đã thành công hay không và mô hình cũng không thể diễn tả lịch biểu "thử lại" thường xuyên hơn.

BẤT KWAY - Bạn có thể làm những gì bạn muốn. Viết một tập lệnh, 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 nội dung nào đó * ghi lại "lần chạy cuối cùng" và nếu đã> 3 ngày trước **, hãy thực hiện công việc và đặt lại dấu thời gian "chạy lần cuối".

(* mà chỉ ghi lại ngày tháng là một chút của nhà nước tiếp tục tồn tại mà bạn có thể thao tác và kiểm tra, nhưng mà cron không thể)

** hãy cẩn thận với thời gian số học nếu bạn đang sử dụng đồng hồ con người có thể đọc được time-- hai lần một năm, một số ngày có 23 hoặc 25 giờ trong ngày của họ, và 02: 00-02: 59 xảy ra hai lần trong một ngày hoặc không phải ở tất cả. Sử dụng UTC để tránh điều này.

+0

Câu trả lời này phải là câu trả lời được chấp nhận! – user1527576

0

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ó thể có điều kiện trong tập lệnh để kiểm tra ngày hiện tại của tháng .

Tôi nghĩ tất cả những gì bạn cần cho điều này thay vì */3 có nghĩa là cứ ba ngày một lần, sử dụng 1/3 có nghĩa là cứ ba ngày một lần bắt đầu vào ngày 1 của tháng. nên 7/3 có nghĩa là cứ ba ngày một lần bắt đầu từ ngày 7 của tháng, v.v.

4
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. Dưới đây là 20 chạy theo lịch trình -

  • 2015-06-01 00:00:00
  • 2015-06-04 00:00:00
  • 2015-06-07 00:00:00
  • 2015-06-10 00:00:00
  • 2015-06-13 00:00:00
  • 2015-06-16 00:00:00
  • 2015-06-19 00:00: 00
  • 2015-06-22 00:00:00
  • 2015-06-25 00:00:00
  • 2015-06-28 00:00:00
  • 2015-07-01 00:00:00
  • 2015-07-04 00:00: 00
  • 2015-07-07 00:00:00
  • 2015-07-10 00:00:00
  • 2015-07-13 00:00:00
  • 2015-07-16 00: 00:00
  • 2015-07-19 00:00:00
  • 2015-07-22 0 0:00:00
  • 2015-07-25 00:00:00
  • 2015-07-28 00:00:00
+2

2015-07-31 00:00:00, 2015-08-01 00:00:00 ... OOPS chỉ 1 ngày giữa các lần chạy – Dziamid

2

Làm thế nào về:

00 00 * * * every 3 days && echo test 

đâu every là một tập lệnh:

#!/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 hàng ngày.

Sử dụng */3 chạy vào ngày 3, 6, ... 27, 30 của tháng, nhưng sau đó sai sau một tháng có ngày thứ 31. Kịch bản every chỉ sai sau cuối năm.

0

Bạn nên tìm hiểu các khái niệm cơ bản về crontab.

Sửa cron bởi lệnh crontab -e và sau đó ^(CTRL) + X sau đó Y và cuối cùng nhấn ENTER (cửa sổ mới) trên mac để lưu các tập tin. Bạn có thể kiểm tra crons mới đã được lắp đặt không phải bởi crontab -l

Một file crontab có năm lĩnh vực để xác định phút, giờ, ngày tháng, tháng, và các ngày trong tuần tiếp theo là lệnh để chạy vào 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 lĩnh vực giá trị trên nghĩa là tất cả các giá trị pháp lý như trong niềng răng cho cột đó.

Ở đây, tôi đã viết một bài chi tiết về nó: Setup Cron in Unix

0

Tôi không phải là chuyên gia cron, nhưng làm thế nào về:

0 */72 * * * 

Nó sẽ chạy mỗi 72 giờ không gián đoạn.

https://crontab.guru/#0_/72___

0

0 0 * * * [ $(($(( date +% - j - 1)) % 3)) == 0 ] && script

Lấy ngày trong năm từ date, bù đắp bằng 1 tới bắt đầu từ 0, kiểm tra xem nó là modulo ba.

Các vấn đề liên quan