我需要在给定命令开始之前随机化时间。我意识到在脚本中执行此操作相对简单,或者编写一个“包装器”脚本来执行此操作,但我想知道是否有人知道一个已经存在的轻量级二进制程序,可以在不需要解释器的情况下完成此操作已加载。
编辑:更具体地说,我不想以任何方式涉及 bash。为了论证,假设没有可用的 shell,并且我从非交互式程序调用它。
答案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 不会介意你只是按照手册页上的说明去做)。我在 Mac OS X 机器上遇到了一些麻烦,这些功能已被弃用,取而代之的是random
/srandom
。 - 从历史上看,许多实现都
rand
具有较差的数字特征。在此应用程序中这不应该是问题,但如果是,请将其替换为更好的 PRNG。 - 这个玩具中的命令行参数处理有点原始。
- 延迟是从某个范围内统一选择的。对于某些应用程序,您可能更喜欢无界分布,例如指数。 Stack Overflow 有很多关于如何从统一的 PRNG 中获得非均匀分布的问题。
答案3
最简单的是sleep
命令。要从现在起十秒后运行您的程序,请执行以下操作:
sleep 10 && your_command
如果您需要更复杂一点的话,下一步就是at
调度程序。您可以安排任务在一小时内运行,如下所示:
echo "your_command" | at +1 hour