Chạy một kịch bản qua cron mỗi tuần


12

Tôi đã thực hiện khá nhiều nghiên cứu về cách thực hiện điều này và tôi thấy không có cách nào trực tiếp để điều hành công việc, vào mỗi thứ Năm khác.

Ngay bây giờ, tôi đang nghiêng về việc tạo một tập lệnh sẽ chạy mỗi tuần và sẽ chạm vào tệp "cờ" khi nó chạy, và nếu nó chạy và tệp đã ở đó, để xóa tệp (và không thực hiện hành động hai tuần một lần).

Câu hỏi của tôi là, có cách nào khác thanh lịch hơn hoặc đơn giản hơn để thực hiện mục tiêu này của một tập lệnh bash hành động chạy mỗi tuần tự động không?

Cảm ơn!


1
Thay vì tệp cờ, bạn có thể sử dụng số tuần ISO. (Ví dụ:% V của strftime)

@Roger: Tôi đoán bạn có nghĩa là trong một điều kiện trong kịch bản.
Tạm dừng cho đến khi có thông báo mới.

@Dennis: Không cần phải (ví dụ: xem câu trả lời của tôi kiểm tra bên ngoài tập lệnh), nhưng quan điểm chính của tôi là nó sẽ đơn giản hơn nhiều và không yêu cầu trạng thái nào trong hệ thống tập tin. Tuy nhiên, tôi nhận ra nó có một nhược điểm tương tự như ngày kiểm tra trong tháng: một số năm có 53 tuần và một số có 52.

Câu trả lời:


11
0 0 * * Thu bash -c '(($(date +\%s) / 86400 \% 14))' && your-script

Tôi đã sử dụng bash để làm toán vì tôi lười biếng; chuyển nó thành bất cứ thứ gì bạn thích Tôi tận dụng ngày 1 tháng 1 năm 1970 là thứ Năm; cho những ngày khác trong tuần bạn phải áp dụng một khoản bù. Cron cần các dấu hiệu phần trăm thoát.

Kiểm tra nhanh:

function check {
  when=$(date --date="$1 $(($RANDOM % 24)):$(($RANDOM % 60))" --utc)
  echo -n "$when: "
  (($(date +%s --date="$when") / 86400 % 14)) && echo run || echo skip
}

for start in "2010-12-02" "2011-12-01"; do
  for x in $(seq 0 12); do
    check "$start + $(($x * 7)) days"
  done
  echo
done

Lưu ý Tôi đã chọn thời gian ngẫu nhiên để hiển thị việc này sẽ hoạt động nếu chạy bất cứ lúc nào vào Thứ Năm và chọn các ngày vượt qua ranh giới năm cộng với các tháng có cả 4 và 5 Thứ Năm.

Đầu ra:

Thu Dec  2 06:19:00 UTC 2010: run
Thu Dec  9 23:04:00 UTC 2010: skip
Thu Dec 16 05:37:00 UTC 2010: run
Thu Dec 23 12:49:00 UTC 2010: skip
Thu Dec 30 03:59:00 UTC 2010: run
Thu Jan  6 11:29:00 UTC 2011: skip
Thu Jan 13 13:23:00 UTC 2011: run
Thu Jan 20 20:33:00 UTC 2011: skip
Thu Jan 27 16:48:00 UTC 2011: run
Thu Feb  3 17:43:00 UTC 2011: skip
Thu Feb 10 05:49:00 UTC 2011: run
Thu Feb 17 08:46:00 UTC 2011: skip
Thu Feb 24 06:50:00 UTC 2011: run

Thu Dec  1 21:40:00 UTC 2011: run
Thu Dec  8 23:24:00 UTC 2011: skip
Thu Dec 15 22:27:00 UTC 2011: run
Thu Dec 22 02:47:00 UTC 2011: skip
Thu Dec 29 12:44:00 UTC 2011: run
Thu Jan  5 17:59:00 UTC 2012: skip
Thu Jan 12 18:31:00 UTC 2012: run
Thu Jan 19 04:51:00 UTC 2012: skip
Thu Jan 26 08:02:00 UTC 2012: run
Thu Feb  2 17:37:00 UTC 2012: skip
Thu Feb  9 14:08:00 UTC 2012: run
Thu Feb 16 18:50:00 UTC 2012: skip
Thu Feb 23 15:52:00 UTC 2012: run

2
Vài giây kể từ kỷ nguyên vốn có trong UTC, trong khi cron chạy theo giờ địa phương. Nếu múi giờ hệ thống của bạn không phải là UTC, điều này sẽ dẫn đến sự nhầm lẫn. ("Tại sao nó không chạy? Ồ, đã là thứ Sáu ở UTC"). Sự tồn tại của thời gian tiết kiệm ánh sáng ban ngày làm cho việc giải quyết vấn đề này trở nên khó khăn hơn nhiều (mặc dù không phải là không thể, vì ngày cal cho bạn biết bù đắp UTC hiện tại)
derobert

5

Một cách có thể là sử dụng attiện ích nếu bạn đang chạy Linux. Bạn có thể đặt phần này ở cuối tập lệnh của mình:

at X + 2 weeks -f myscript

Trong đó X là thời gian bạn muốn chạy tập lệnh của mình tại. Để khởi tạo, chỉ cần gọi atcho lần đầu tiên bạn muốn chạy nó và sau đó câu lệnh trên tiếp tục làm mới cuộc gọi theo lịch trình của bạn.


Nếu đây sẽ là một giải pháp lâu dài, tôi không khuyên bạn nên chạy nó mặc dù lúc đó tôi sẽ tạo ra một chức năng trong kịch bản để biết liệu nó có cần chạy hay không
Paul

3

Nếu bạn có thể sử dụng anacrontrên hệ thống, mọi thứ sẽ đơn giản hơn nhiều. Để sử dụng, anacronbạn phải cài đặt nó và bạn cũng phải có quyền truy cập root. Nó không hoạt động trên các hệ thống cũ (ví dụ: RHEL 5.x), các phiên bản cũ hơn của ancron CHỈ chạy khi khởi động. Nó hoạt động với các hệ thống mới hơn (ví dụ: RHEL 6.x).

Với anacron, người ta có thể sắp xếp công việc theo cách linh hoạt hơn, ví dụ như chạy công việc X mỗi tuần một lần. Cũng thếanacron chạy các công việc khi máy tính có sẵn, tức là bạn không phải xem xét khi hệ thống lên hoặc xuống.

Để chạy tập lệnh mỗi tuần, bạn phải thêm một dòng tương tự như sau vào / etc / anacrontab:

14 5 myScript script.sh

Hãy xem trang người đàn ông để biết chi tiết.


Sử dụng anacronrõ ràng là giải pháp IMO sạch nhất (trừ khi nó có một số hậu quả không mong muốn đối với một số người).
JanC

0

Tôi không chắc chắn nếu có một cách thanh lịch hơn để xác định mỗi tuần, nhưng điều này có thể làm việc cho bạn.

00 06 1-7,15-21 * * test `date +\%a` = Thu && /path/to/script

Điều này sẽ khởi chạy kịch bản vào lúc 6:00 sáng vào thứ Năm đầu tiên và thứ ba trong tháng.


2
Tuy nhiên, điều đó sẽ kết thúc việc bỏ qua một tuần nếu có một tháng với 3 ngày thứ Năm.
David Z

1
Có một tháng chỉ có 3 ngày thứ năm? Mặc dù tôi có thể thấy nó bỏ qua một tuần nếu có 5 ngày thứ năm. Nó có thể được cập nhật 1-7,15-21,29-31, nhưng sau đó nó sẽ chạy ngược lại nếu có bất kỳ trận đấu nào cho tập cuối ...
pferate

1
Đến 3 ngày thứ năm, ý bạn là 3 ngày thứ năm mà kịch bản sẽ chạy chứ không phải 3 thứ năm? Tôi có thể đã đọc sai nó lần đầu tiên.
phiền

0

Tôi sẽ chạy nó mỗi tuần và kiểm tra kịch bản để xem số tuần có phải là số lẻ không: nếu có thoát.

Điều này sẽ cần thêm một số suy nghĩ để làm việc từ tháng 12 đến tháng 1.

Có lẽ tập lệnh đã đặt tập tin cờ "chạy thành công cuối cùng". Khi tập lệnh khởi chạy, hãy kiểm tra tệp cờ đã được sửa đổi lần cuối cách đây 14 ngày.

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.