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