在随机延迟后运行命令的轻量级实用程序/程序

在随机延迟后运行命令的轻量级实用程序/程序

我需要在给定命令开始之前随机化时间。我意识到在脚本中执行此操作相对简单,或者编写一个“包装器”脚本来执行此操作,但我想知道是否有人知道一个已经存在的轻量级二进制程序,可以在不需要解释器的情况下完成此操作已加载。

编辑:更具体地说,我不想以任何方式涉及 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系列函数的代码部分(您想要哪个函数取决于您在内部如何指定它)。

问题在这里:

  • 这假设你的系统randsrand健全的(好的 PRNG 不会介意你只是按照手册页上的说明去做)。我在 Mac OS X 机器上遇到了一些麻烦,这些功能已被弃用,取而代之的是random/ srandom
  • 从历史上看,许多实现都rand具有较差的数字特征。在此应用程序中这不应该是问题,但如果是,请将其替换为更好的 PRNG。
  • 这个玩具中的命令行参数处理有点原始。
  • 延迟是从某个范围内统一选择的。对于某些应用程序,您可能更喜欢无界分布,例如指数。 Stack Overflow 有很多关于如何从统一的 PRNG 中获得非均匀分布的问题。

答案3

最简单的是sleep命令。要从现在起十秒后运行您的程序,请执行以下操作:

sleep 10 && your_command

如果您需要更复杂一点的话,下一步就是at调度程序。您可以安排任务在一小时内运行,如下所示:

echo "your_command" | at +1 hour

相关内容