Cron không chạy vào ngày cụ thể nhưng tất cả các ngày khác


8

Tôi có một thiết lập cron để thực thi tập lệnh bash hàng ngày vào lúc 10 giờ tối. Tôi có một thiết lập cron khác để chạy hàng tháng vào ngày đầu tiên của tháng. Cả hai crons đều khởi chạy một tập lệnh bash và khác biệt duy nhất trong tập lệnh bash là đối số mà chúng truyền vào chương trình java bên dưới (mô phỏng khởi chạy dòng lệnh của chương trình java).

Vấn đề là, tôi cần phải vô hiệu hóa cron hàng ngày vào ngày đầu tiên của tháng để cả hai không cố chạy trong cùng một ngày. Điều này có thể làm tự động?

Tôi cho rằng tôi có thể tạo một tập lệnh bash khác để chỉnh sửa cron trước số 1 sau đó một lần nữa để thiết lập lại mọi thứ, nhưng điều này có vẻ ... ô uế.


Không phải tất cả các tháng có 31 ngày, điều đó có gây ra vấn đề không?
SnakeDoc


một tốt thay thế cho các giải pháp được cung cấp bởi @suspectus
SnakeDoc

2
hoặc 2-31 cho lĩnh vực ngày trong tháng.
tro

@ash - xem câu trả lời của tôi, đó chính xác là những gì tôi đề xuất.
slm

Câu trả lời:


10

Theo cách tương tự với giải pháp được đề xuất bởi @StephaneChazelas trong các nhận xét, bạn có thể chỉ định phạm vi ngày trong trường thứ 3 là phạm vi cho cron mà bạn muốn chạy mỗi ngày ngoài ngày đầu tiên của tháng.

Hai mục sau đây sẽ thực hiện những gì bạn sau:

   0 22 1 * *      /path/to/script/1st_of_the_month.bash    
   0 22 2-31 * *   /path/to/script/every_day_except_1st.bash

thực tế, dường như không hiệu quả với tôi (trừ khi tôi đang làm gì đó sai) - định dạng trong các bình luận rất tệ - vì vậy hãy xem pastbin của tôi để biết những gì tôi đang nhận được: pastebin.com/RKvy5d4e
SnakeDoc

Rất tiếc, nó phải là 0 22 2-31 * * trong ví dụ của bạn. Tôi sẽ chỉnh sửa.
SnakeDoc

1
@SnakeDoc - cảm ơn, tất cả các cột đó bắt đầu hòa trộn sau một thời gian 8-)
slm

yup tôi cũng quên chúng - Tôi đã thiết lập chúng, sau đó quên cách tôi đã làm điều đó (điều tốt cho trang người đàn ông lol)
SnakeDoc

8

Cách dễ nhất để giải quyết vấn đề này chỉ là có một mục cron. Sửa đổi tập lệnh bash để kiểm tra ngày - nếu đó là ngày đầu tiên của tháng thì hãy gọi chương trình java với các tham số hàng tháng, người khác gọi chương trình với thông số hàng ngày.

Thay đổi tập lệnh làm cho quá trình đơn giản hơn vì tập lệnh dưới dạng tài liệu sẽ mô tả tốt hơn những gì đang xảy ra mà không yêu cầu thêm thông tin trong bảng cron.

Các mod script có thể trông giống như thế này-:

if [ $(date '+%d') == "1" ];then
   # monthly code
else
   # daily code
fi

1
đã kết thúc với giải pháp này. Tôi đã tạo một tập lệnh bash khác với mã mẫu của bạn và theo tháng - nó sẽ khởi động tập lệnh bash hàng tháng (lần lượt cung cấp đối số hàng tháng cho chương trình java cơ bản), hàng ngày khởi động tập lệnh hàng ngày, v.v.
SnakeDoc

0
if [ $(date '+%d') == "1" ];then
  # monthly code
else
   # daily code
fi

Tôi nghĩ rằng sử dụng so sánh số nguyên nếu chính xác hơn

ngày '+% d' trả về 01 chứ không phải 1 vì vậy sử dụng == chuỗi comparaison sẽ là sai

thay thế

if [ $(date '+%d') eq 1 ];then
    # monthly code
else
   # daily code
fi
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.