Tiện ích / chương trình nhẹ để chạy lệnh sau một độ trễ ngẫu nhiên


7

Tôi cần chọn ngẫu nhiên thời gian trước khi một lệnh đã cho bắt đầu. Tôi nhận ra rằng việc thực hiện điều này trong một kịch bản là tương đối tầm thường hoặc để viết một kịch bản "trình bao bọc" để thực hiện điều này, nhưng tôi tự hỏi liệu có ai biết một chương trình nhị phân nhẹ đã thực hiện được mà không cần phải có trình thông dịch không nạp vào.

EDIT: Cụ thể hơn, tôi không muốn liên quan đến bash theo bất kỳ cách nào. Giả sử vì lý do tranh luận rằng không có vỏ có sẵn và tôi đang gọi điều này từ một chương trình không tương tác.

Câu trả lời:


4

Nếu bạn muốn kiểm soát chi tiết hơn so với các câu thần chú bash đẹp của maxschlepzig , thì việc viết mã:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>

int main(int argc, char**argv){
  useconds_t mdelay=0, delay;
  if (argc<3){
    fprintf(stderr,"%s <delay (in milli-seconds)> <command> <args>* :\n\trun commands with a random delay\n",argv[0]);
    exit(1);
  }
  mdelay=atol(argv[1]);
  /* seed random number generator with the time */
  srand(((unsigned int)time(NULL))%RAND_MAX); 
  delay = mdelay * (rand() / (1.0 + RAND_MAX));
  usleep(delay*1000);
  execvP(argv[2],getenv("PATH"),argv+2);

  return 0;
}

Biên dịch với một cái gì đó như gcc randomdelay.c -o randomdelayvà gọi nó như

$ randomdelay 10000 echo Hi!

Nếu bạn đang làm điều này là một bối cảnh lập trình, bạn có thể tốt hơn là chỉ lấy một phần của mã chọn độ trễ ngẫu nhiên cho bạn và gọi một exechàm gia đình (cái nào bạn muốn phụ thuộc vào chính xác cách bạn đã chỉ định nội bộ).

Vấn đề ở đây:

  • Điều này giả định hệ thống của bạn rand/ srandlà lành mạnh (không phải PRNG tốt cho bạn biết rằng họ làm những gì trang nam nói họ làm). Tôi đã gặp một số rắc rối với nó trên hộp Mac OS X của mình, nơi các chức năng đó không được dùng để ủng hộ random/ srandom.
  • Trong lịch sử, nhiều thực hiện randđã có đặc điểm số kém. Đó không phải là một vấn đề trong ứng dụng này, nhưng nếu có, hãy thay thế nó bằng PRNG tốt hơn.
  • Việc xử lý đối số dòng lệnh trong đồ chơi này là một chút nguyên thủy.
  • Độ trễ được chọn thống nhất từ ​​một số phạm vi. Đối với một số ứng dụng, bạn có thể thích phân phối không giới hạn như số mũ. Stack Overflow có nhiều câu hỏi về cách nhận phân phối không đồng đều từ các PRNG thống nhất.

Đây chính xác là những gì tôi đã nói về! Cảm ơn!!
LawrenceC

bạn có thể sử dụng gia đình * rand48 () thay vì rand ().
jfs

6

Trong bashbạn có thể làm điều đó như thế này:

sleep $(($RANDOM%3)) && some_command

do đó chờ trong khoảng từ 0 đến 2 giây trước khi thực hiện lệnh. Hoặc chọn một khoảng khác.

Hoặc nếu $RANDOMkhông có sẵn, bạn có thể thử jot:

sleep `jot -r 1 0 3` && some_command

Chắc chắn, chờ đợi ngẫu nhiên cộng với thực thi không được cung cấp bởi một nhị phân duy nhất, nhưng đóng. Chà, có một nhị phân đơn sẽ ít trực giao hơn, nó sẽ chống lại nguyên tắc một công cụ cho một công việc (và nguyên tắc đơn giản (KISS)).


1

Đơn giản nhất là sleeplệnh. Để chạy chương trình của bạn mười giây kể từ bây giờ, hãy làm một cái gì đó như thế này:

sleep 10 && your_command

Tiếp theo nếu bạn cần một chút tinh tế sẽ là người atlên lịch. Bạn có thể lên lịch một tác vụ để chạy trong một giờ như vậy:

echo "your_command" | at +1 hour

Điều này không ngẫu nhiên thời gian mặc dù (tôi tưởng tượng bạn có thể kéo nó ra đủ dễ dàng với $RANDOM). Nó cũng có vẻ giống như phương pháp "kịch bản" mà anh ta muốn tránh - anh ta muốn một nhị phân thực hiện nó vì một số lý do
Michael Mrozek

Tôi đã bị mù từ "ngẫu nhiên" khi tôi đỏ câu hỏi. Giấc ngủ sẽ vẫn hoạt động nếu bạn cho nó ăn một con số ngẫu nhiên.
Caleb
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.