Law*_*ceC 7 linux command-line random
我需要在给定命令开始之前随机化时间。我意识到在脚本中执行此操作或编写“包装器”脚本来执行此操作相对简单,但我想知道是否有人知道已经存在的轻量级二进制程序可以在不需要解释器的情况下完成此操作加载。
编辑:更具体地说,我不想以任何方式涉及 bash。为了论证的缘故,假设没有可用的 shell,我是从非交互式程序调用它的。
在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))。
如果您想要比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
(您想要哪个函数取决于您在内部如何指定它)。
问题在这里:
rand
是srand
健全的(好的 PRNG 不会介意你只是按照手册页上的说明去做)。我在 Mac OS X 机器上遇到了一些麻烦,这些功能已被弃用,取而代之的是random
/ srandom
。rand
具有较差的数字特征。在此应用程序中这不应该是问题,但如果是,请将其替换为更好的 PRNG。