Làm thế nào để lên lịch cho một cronjob hai tuần?


10

crontab (5) định nghĩa các trường sau:

       field         allowed values
       -----         --------------
       minute        0-59
       hour          0-23
       day of month  1-31
       month         1-12 (or names, see below)
       day of week   0-7 (0 or 7 is Sun, or use names)

và giải thích:

 Step values can be used in conjunction with ranges.  Following a range
 with ``/<number>'' specifies skips of the number's value through the
 range.  For example, ``0-23/2'' can be used in the hours field to specify
 command execution every other hour (the alternative in the V7 standard is
 ``0,2,4,6,8,10,12,14,16,18,20,22'').

Vì vậy, không có việc làm hai tuần một lần, theo như sự hiểu biết của tôi. Tôi khá chắc chắn có cách giải quyết, bạn là gì? Hay tôi đã bỏ lỡ điều gì?


2
Câu trả lời tốt nhất tôi có thể tìm thấy ở đây là: unix.stackexchange.com/questions/1224/iêu
Somantra

... và những câu trả lời trên U & L sẽ là cách tôi thực hiện, @Somantra :-)
voretaq7

@ voretaq7, tôi đã nói rằng đó là câu trả lời chính tắc, nhưng tôi không muốn đi qua như là mô phạm ;-)
Somantra

Câu trả lời:


8

Bạn có thể có thứ được điều hành bởi cron mỗi thứ tư, sau đó hãy chạy thứ đó quyết định xem đó là một tuần chẵn hay một tuần lẻ. ví dụ:

#!/bin/bash
week=$(date +%U)
if [ $(($week % 2)) == 0 ]; then 
    echo even week
else 
    echo odd week
fi

Đây là một giải pháp tốt, tuy nhiên, thực sự không trả lời được câu hỏi - tôi không muốn làm hỏng điều đó bằng logic lịch trình. Có lẽ tôi có thể tích hợp điều này với liên kết @Somantra đã đưa ra.
La Mã

Được rồi, tôi phải thừa nhận: đây là giải pháp tốt nhất cho đến nay. Liên kết mà @Somantra đưa ra đạt được kết quả tương tự IMHO phức tạp không cần thiết (tính theo thời gian UNIX), nhưng việc thêm cách tiếp cận của bạn trực tiếp vào cronjob (thay vì vào tập lệnh) theo cùng một kiểu làm cho nó khá thanh lịch.
La Mã

Điều này phá vỡ trong năm 2020 vì nó có 53 tuần. Ví dụ: Nếu cron của bạn được lên kế hoạch chạy bi hàng tuần vào ngày 31 tháng 12, thì nó sẽ chạy vào ngày 31 tháng 12 năm 2020 (tuần thứ 53) và ngày 4 tháng 1 năm 2020 (tuần đầu tiên).
mad_fox

4

Nhiều phạm vi (bạn không chỉ định bạn đang sử dụng) phạm vi hỗ trợ. Vì vậy, một cái gì đó như

0 0 1-7,15-21 * 3

Sẽ đạt thứ tư đầu tiên và thứ ba trong tháng.


Điều này thanh lịch hơn một chút so với phương pháp "thực hiện trong kịch bản", nhưng hãy nhớ thêm một nhận xét vào crontab của bạn (quy tắc chung: nếu bạn có nhiều hơn một -hoặc /tham gia có lẽ nên bình luận để mô tả lịch trình)
voretaq7

Tôi nghi ngờ điều này là sai; nó sẽ khiến công việc được chạy vào ngày 1 đến ngày 7 và 15-21 mỗi tháng vào mỗi thứ tư. Điều này từ man 5 crontab: " Ngày thực hiện lệnh có thể được chỉ định bởi hai trường - ngày trong tháng và ngày trong tuần. Nếu cả hai trường bị hạn chế (nghĩa là không *), lệnh sẽ được chạy khi một trong hai trường khớp với thời gian hiện tại. Ví dụ: "30 4 1,15 * 5" sẽ khiến lệnh được chạy vào lúc 4:30 sáng ngày 1 và 15 mỗi tháng, cộng với mỗi thứ Sáu "(nhấn mạnh của tôi).
MadHatter

1
Trên thực tế, điều đó phụ thuộc vào cron daemon mà bạn đang sử dụng. Mục nhập của bạn dường như là từ vixie cron (bao gồm trong các bản phân phối RedHat). Từ "man crontab" trên cron của dillo (Slackware): Nếu bạn chỉ định cả một ngày trong tháng và một ngày trong tuần, * nó sẽ được hiểu là ngày thứ N trong tháng *. Tuy nhiên, một giải pháp theo kịch bản (tính số tuần) trông giống như giải pháp di động duy nhất.
AlvaroGMJ

2

Đối với một cái gì đó cần phải chạy mỗi tuần, hãy sử dụng một lớp lót này:

0 0 * * 5 [ `expr \`date +\%V\` \% 2` -eq 0 ] && echo "execute script" 

Kịch bản đặc biệt này được lên kế hoạch để chạy vào thứ Sáu. Tuần được thực hiện có thể được điều chỉnh bằng cách sử dụng "-eq 0" hoặc "-eq 1"


1

Anacron là một cách giải quyết tốt cho những hạn chế của cron.

  • Anacron có tham số Thời gian lặp lại mà bạn có thể đặt thành 14.

lệnh định thời công việc trì hoãn

14 15 test.d Daily /path/to/script.sh


Thật không may, anacron không thể được sử dụng. Quên đề cập đến điều đó.
La Mã

1

Nếu nhu cầu của bạn không theo nghĩa đen hai tuần một lần, bạn chỉ cần chạy cronjob vào ngày 1 và 15 của tháng:

15 8 1,15 * * /your/script.sh

Bắt đầu lúc 8:15 sáng ngày đầu tiên và mười lăm mỗi tháng bất kể ngày nào trong tuần.


-2

Từ giải thích đó, thiết lập 3/2 trên trường tuần sẽ chạy nhiệm vụ vào mọi thứ tư khác - nó ẩn, nhưng tôi nghĩ có thể thực hiện được.


không, điều này tương đương với việc for(int i=3; i <=3 ; i+=2) {} nó chỉ trải qua điều này một lần, không thành vấn đề nếu "bước" là 1 hoặc 2.
hầm

Những gì @stew nói. Ngoài ra, không có "trường tuần".
La Mã

Theo trường tuần, ý tôi là "Trường trong tuần"
Journeyman Geek
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.