Tôi có thể tạo ngẫu nhiên cron đỉnh không?


12

Có lẽ tôi hoàn toàn thất bại, và nếu vậy - điều đó tốt. Nhưng làm thế nào tôi có thể sắp xếp một công việc để lên lịch ngẫu nhiên phát một thông điệp ngớ ngẩn, như từ fortune?

làm rõ
có - đây là máy trạm cá nhân của tôi - không có kế hoạch làm một cái gì đó mạnh mẽ trên một máy chủ sản xuất :)

Câu trả lời:


12

atcó giao diện đơn giản hơn cho loại mục đích này nếu atđược cài đặt, máy đang chạy atdvà người dùng được phép sử dụng lệnh.

Ví dụ: (kiểm tra cú pháp chính xác bằng cách sử dụng man athoặc info at),

at -f tập tin now + 53 minutes

hoặc là

at -f tập tin now + 2 hours

sẽ chạy các lệnh trong tệp được chỉ định trong 53 phút hoặc 2 giờ, tương ứng.

at sau đó có thể được chạy lại khi bắt đầu công việc được lên lịch với các đơn vị bắt đầu, đếm và thời gian phù hợp (ngẫu nhiên hoặc theo cách khác).

Biên tập

Như Arjan chỉ ra một cách hữu ích dưới đây, nếu bạn đang sử dụng ứng dụng này cho mục đích khác ngoài ứng dụng đồ chơi, bạn cần suy nghĩ về các vấn đề như những gì xảy ra

  1. nếu lần chạy tiếp theo bắt đầu trước khi lần chạy trước kết thúc (ví dụ: tập lệnh được đăng ký lại?) hoặc

  2. nếu một lần chạy không hoàn thành chính xác hoặc

  3. nếu lần chạy tiếp theo không khởi động được hoặc đúng giờ (ví dụ: điều gì xảy ra nếu máy bị tắt khi lần chạy tiếp theo là do bắt đầu) và

  4. về việc đăng nhập và báo cáo các lần chạy thất bại hoặc thành công.


đó là một cách tiếp cận tôi đã không cân nhắc - và có thể được thực hiện đệ quy, nếu filecó lần atchạy tiếp theo , đúng không?
warren

tuyệt vời - chỉ cần dùng thử và hoạt động tuyệt vời :)
warren

2
+1, nhưng một vài điều cần xem xét: nếu at-command là dòng đầu tiên và nếu tập lệnh chạy trong một thời gian dài (hoặc nếu các khoảng thời gian ngắn), thì hãy cẩn thận khi chạy nhiều phiên bản cùng một lúc. Nhưng khi atở dòng cuối cùng của kịch bản, thì rõ ràng sẽ không có lịch trình lại sẽ được thực hiện nếu kịch bản thất bại. Ngoài ra, việc chạy tập lệnh từ dòng lệnh cũng sẽ khiến nó (lại) lên lịch trình (và: nhiều lịch trình có thể tồn tại đồng thời). Và cronhỗ trợ gửi bất kỳ lỗi nào (hoặc: đầu ra nói chung) qua email; Tôi không biết nếu atcó một cái gì đó như vậy là tốt?
Arjan

@Arjan - Tôi không quá lo lắng về việc nó bị lỗi và không gửi email cho tôi .. vì (tại thời điểm này) tôi chỉ sử dụng nó để vui chơi trên máy trạm của mình :) .. dù sao đi nữa - đó điều cần suy nghĩ nếu điều này được mở rộng thành, kiểm tra ngẫu nhiên để xâm nhập
warren

kịch bản tôi đang hình dung sẽ không quan tâm có bao nhiêu bản sao đang chạy cùng một lúc
warren

13

Tôi có nhiều lệnh trong / etc / crontab đang làm tất cả các loại và một số cần độ chính xác trong vài giây. Bây giờ cron có thể có độ phân giải tốt hơn trong khi giữ cho tất cả các lần nhìn thấy và tập trung.

Ví dụ này nhận và phân tích một trang web trong khoảng từ 10 đến 50 giây trước mỗi 5 phút:

4-59/5 * * * * root (sleep $(($RANDOM\%40+10))) && /etc/munin/plugins/someplugin prefetch

Nó không phải có thời gian chính xác vì dữ liệu di chuyển chậm, nhưng nó giúp giữ thời gian thực hiện nút munin càng thấp càng tốt bằng cách không phải chờ các trang web. (Plugin tiếp tục lưu trữ trang trong 30 phút để giảm lượt truy cập không cần thiết, nhưng cần cập nhật cơ sở dữ liệu cứ sau 5 phút).

Lưu ý \% - cron thay thế% cho "\ n" - hữu ích để giữ văn bản thư trên một dòng.


nếu bạn đang lưu trữ các trang web, bạn không nhất thiết phải nhận được kết quả tải chính xác
warren

1
vâng, tôi biết - 'dữ liệu di chuyển chậm' - plugin có tỷ giá hối đoái từ một trang web và tôi không muốn bị cấm. (Tôi không phải là thương nhân nhưng tôi dành nhiều thời gian để xem biểu đồ munin) Tôi đã tạo một plugin tương tự cho thời tiết địa phương. Ứng dụng vô tận!
Andy Lee Robinson

1
aha .. cách tiếp cận rất tuyệt vời :)
warren

6

Trong nội bộ cron, tôi không nghĩ rằng một tính năng như vậy tồn tại. Tôi nghĩ rằng giải pháp tốt nhất sẽ là đặt lệnh của bạn vào tập lệnh shell và đặt một sleepkhoảng ngẫu nhiên ở đầu tập lệnh và sử dụng $RANDOMbiến. Sau đó chạy kịch bản một lần một ngày trong một công việc định kỳ thông thường.

#!/bin/bash
sleep $(($RANDOM%5))
/path/to/command -param1 -param2

1
ngủ () gần như đảm bảo nó sẽ bị giết bởi nhà cung cấp dịch vụ. Trừ khi, tất nhiên, anh ấy là nhà cung cấp dịch vụ.
Một chú lùn

1
Tôi cho rằng đó là trên máy Linux của riêng anh ta hoặc một cái gì đó nếu anh ta ngẫu nhiên trao tài sản cho ai đó
John T

tốt, đó là sự thật.
Một chú lùn

Tại sao ngủ là một ý tưởng tồi? Chỉ cần hỏi ...
Tadeusz A. Kadłubowski

làm rõ câu hỏi cho @John T
warren

6

Nó sẽ phụ thuộc vào loại khoảng thời gian bạn sau. nhưng hãy để chúng tôi giả sử bạn muốn kịch bản chạy ngẫu nhiên với xác suất 1:30 (cứ sau 30 phút)

  • Xây dựng tập lệnh cron của bạn với tốc độ tối đa là 10 phút. Nó sẽ bắn 3 lần sau mỗi 30 phút.

  • Bên trong kịch bản sử dụng rand là điều kiện để một nếu tuyên bố. Bạn muốn rand trả về một số trong khoảng từ 0 đến 2. Nếu là 0 thì thực hiện nội dung của câu lệnh if.

Về cơ bản, tập lệnh của bạn luôn kích hoạt ở một khoảng thời gian đã đặt. Nhưng sẽ chỉ thực hiện lệnh bạn quan tâm ngẫu nhiên. Nhà cung cấp dịch vụ của bạn sẽ cảm ơn bạn.


@A Dwarf - cũng cảm ơn vì ý tưởng này - đây sẽ là một con đường hữu ích hơn một chút nếu tôi muốn kiểm tra sự xâm nhập vv trên một số cơ sở thường xuyên nhưng gần như ngẫu nhiên
warren
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.