Cronjob chạy hai tuần một lần, vào thứ bảy, bắt đầu vào thứ bảy này


11

Hôm nay là thứ Sáu, ngày 3 tháng 10 năm 2014 3:58 AM

Tôi muốn lên lịch cho một cronjob như thế để chạy nó vào những ngày sau:

  1. Thứ Bảy, ngày 4 tháng 10 năm 2014 8:00 sáng
  2. Thứ Bảy, ngày 18 tháng 10 năm 2014 8:00 sáng
  3. Thứ Bảy, ngày 1 tháng 11 năm 2014 8:00 sáng ... ...

Vì vậy, cứ sau 2 tuần, vào thứ bảy, lúc 8 giờ.

Câu trả lời:


27
0 8 * * 6 test $((10#$(date +\%W)\%2)) -eq 1 && yourCommand

date +%W: số tuần trong năm với thứ Hai là ngày đầu tuần, hôm nay tuần 39

10#$(date +%W): hội tụ date +Wsố thập phân và tránh nhầm lẫn phân tích cú pháp cơ sở shell

$((39%2)): hoạt động modulo: kết quả là 0 (số tuần chẵn) hoặc 1 (số tuần lẻ), kết quả tuần này là 1, tuần sau 0

test 1 -eq 1: kiểm tra số học (bằng), trong trường hợp này kết quả là boolean true

&& yourCommand: Boolean AND: yourCommandchỉ chạy nếu kết quả của lệnh trước đó là boolean true

Lưu ý rằng năm có thể có hai tuần lẻ: 53 (năm nay) và 1 (năm tới)


2
Thật thanh lịch! Như bạn đã lưu ý, nó vẫn có một vụ án vào ngày thứ Bảy thứ 53 trong năm, điều này sẽ xảy ra khoảng bảy mươi năm trong mỗi bốn thế kỷ.
MadHatter

@Cyrus cảm ơn bạn đã trả lời, nhưng nếu tôi viết * * * * 5 kiểm tra $ (($ (ngày +% W)% 2)) -eq 1 && /u02/restore/scripts/test.sh thì tập lệnh không chạy nhưng nếu tôi viết * * * * 5 /u02/restore/scripts/test.sh thì kịch bản sẽ chạy. Tại sao biểu hiện của bạn không hoạt động? Tôi chỉ đang thử nghiệm các trường hợp. Và thấy rằng không hoạt động bằng cách nào đó.
kupa

1
Lỗi của tôi. Cron diễn giải% dưới dạng dòng mới. Thoát cả hai% với một \ trong cronjob của bạn:0 8 * * 6 test $(($(date +\%W)\%2)) -eq 1 && yourCommand
Cyrus

Xin lỗi để trả lại câu hỏi cũ này nhưng nó không hoạt động với tôi và khi tôi cố gắng thực thi trình $((10#$(date +%W)%2)) -eq 1 && echo OKbao của mình, tôi cố gắng thực hiện kết quả của phép tính tuần : -bash: 1: command not found. Bất cứ manh mối tại sao nó làm điều đó? Cảm ơn.
jhuet

3
@jhuet: testkhông có lệnh của người dùng. Hãy thử:test $((10#$(date +\%W)%2)) -eq 1 && echo odd || echo even
Cyrus

4

Những gì bạn đã thể hiện là "mỗi tuần". Sau đó, mã là:

0 8 * * 6

Bạn có chắc chắn bạn cần chạy nó hai tuần một lần?

0 8 * * 6 expr `date +\%s` / 604800 \% 2 >/dev/null || yourCommand

1
Bạn có thể giải thích lệnh này không, làm ơn
kupa

1
Tốt hơn là sử dụng những gì Cyrus đã cho - $ (($ (ngày +% W)% 2)) "W" là viết tắt của một số tuần trong năm. Bắt đầu từ 0 đến 53. Nếu có thể chia cho hai, thì đó là tuần "mỗi giây" của bạn. Vì vậy, cronjob chạy mỗi tuần nhưng 'expr' thực thi lệnh yourCommand chỉ khi số của tuần có thể chia cho 2.
Keo dán

khi tôi chạy thử nghiệm $ (($ (ngày +% W)% 2)) -eq 1 trên dòng lệnh không trả về gì, tại sao?
kupa

1
chỉ cần chạy echo $?sau khi chạy lệnh đó, để xem mã trả về của nó - đó là điều quan trọng với nó
Ale
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.