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

Law*_*ceC 7 linux command-line random

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

编辑:更具体地说,我不想以任何方式涉及 bash。为了论证的缘故,假设没有可用的 shell,我是从非交互式程序调用它的。

max*_*zig 6

bash你可以这样做:

sleep $(($RANDOM%3)) && some_command
Run Code Online (Sandbox Code Playgroud)

因此在执行命令之前等待 0 到 2 秒。或者选择另一个间隔。

或者,如果$RANDOM不可用,您可以尝试jot

sleep `jot -r 1 0 3` && some_command
Run Code Online (Sandbox Code Playgroud)

当然,随机等待加执行不是由单个二进制文件提供的,而是关闭的。好吧,拥有单个二进制文件的正交性会降低,这有点违反一种工具用于一项工作的原则(以及保持简单的原则 (KISS))。


dmc*_*ten 4

如果您想要比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;
}
Run Code Online (Sandbox Code Playgroud)

用类似的东西编译gcc randomdelay.c -o randomdelay并调用它

$ randomdelay 10000 echo Hi!
Run Code Online (Sandbox Code Playgroud)

如果您在编程环境中执行此操作,那么您最好只获取为您选择随机延迟并调用系列函数的代码部分exec(您想要哪个函数取决于您在内部如何指定它)。

问题在这里:

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