임의 지연 후 명령을 실행하는 경량 유틸리티/프로그램

임의 지연 후 명령을 실행하는 경량 유틸리티/프로그램

주어진 명령이 시작되기 전의 시간을 무작위로 지정해야 합니다. 스크립트에서 이 작업을 수행하거나 이를 수행하기 위해 "래퍼" 스크립트를 작성하는 것이 상대적으로 간단하다는 것을 알고 있지만 인터프리터 없이 이 작업을 수행할 수 있는 이미 존재하는 경량 바이너리를 아는 사람이 있는지 궁금합니다. 짐을 실은.

편집: 좀 더 구체적으로 말하면 bash를 어떤 식으로든 포함하고 싶지 않습니다. 논증을 위해 사용 가능한 쉘이 없고 비대화형 프로그램에서 호출한다고 가정합니다.

답변1

다음을 수행할 수 있습니다 bash.

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

따라서 명령을 실행하기 전에 0~2초 정도 기다리십시오. 아니면 다른 간격을 선택하세요.

또는 $RANDOM사용할 수 없는 경우 다음을 시도해 볼 수 있습니다 jot.

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

물론 무작위 대기와 실행은 단일 바이너리로 제공되지는 않지만 가깝습니다. 글쎄요, 바이너리를 갖는 것은 덜 직교적일 것입니다. 이는 "하나의 작업을 위한 하나의 도구" 원칙(그리고 단순 원칙 유지(KISS))에 위배됩니다.

답변2

좀 더 세밀하게 제어하고 싶다면maxschlepzig 아름다운 bash 주문, 코드 작성은 매우 쉬운 문제입니다.

#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;
}

다음과 같이 컴파일 gcc randomdelay.c -o randomdelay하고 호출하십시오.

$ randomdelay 10000 echo Hi!

프로그래밍 환경에서 이 작업을 수행하는 경우 임의의 지연을 선택하고 일련의 함수를 호출하는 코드 부분을 가져오는 것이 더 나을 것입니다 exec(원하는 함수는 내부적으로 어떻게 지정했는지에 따라 다릅니다). .

문제는 여기에 있습니다:

  • 이는 시스템이 양호 rand하다고 가정합니다 srand(맨 페이지의 지침만 따르면 좋은 PRNG는 문제가 되지 않습니다). random/ 을 (를) 위해 이러한 기능이 더 이상 사용되지 않는 Mac OS X 시스템에 문제가 있습니다 srandom.
  • 역사적으로 많은 구현에서는 rand수치적 특성이 좋지 않았습니다. 이는 이 애플리케이션에서는 문제가 되지 않지만, 그렇다면 더 나은 PRNG로 교체하십시오.
  • 이 장난감의 명령줄 인수 처리는 약간 원시적입니다.
  • 지연은 범위에서 균일하게 선택됩니다. 일부 응용 프로그램의 경우 지수 분포와 같은 무제한 분포를 선호할 수 있습니다. 균일한 PRNG에서 균일하지 않은 분포를 얻는 방법에 대해 Stack Overflow에 많은 질문이 있습니다.

답변3

가장 간단한 것은 sleep명령입니다. 지금부터 10초 후에 프로그램을 실행하려면:

sleep 10 && your_command

좀 더 복잡한 것이 필요하다면 다음 단계는 다음과 같습니다.at스케줄러. 다음과 같이 작업이 한 시간 내에 실행되도록 예약할 수 있습니다.

echo "your_command" | at +1 hour

관련 정보