ランダム遅延後にコマンドを実行する軽量ユーティリティ/プログラム

ランダム遅延後にコマンドを実行する軽量ユーティリティ/プログラム

指定されたコマンドが開始されるまでの時間をランダムに指定する必要があります。私はスクリプトでこれを行うか、それを実行するために「ラッパー」スクリプトを書くのが比較的簡単であることを知っていますが、インタプリタなしでこれを実行できる既に存在する軽量バイナリを知っている人がいるかどうか疑問に思います。荷物を積んだ。

編集:もっと具体的に言えば、bashを何らかの形で含めたくありません。議論のために利用可能なシェルがなく、非対話型プログラムから呼び出されると仮定します。

答え1

次のことができますbash

sleep $(($RANDOM%3)) && some_command

したがって、コマンドを実行する前に0〜2秒待ってください。または別の間隔を選択してください。

または$RANDOM使用できない場合は、次のことを試すことができますjot

sleep `jot -r 1 0 3` && some_command

もちろん、ランダムな待機と実行は単一のバイナリでは提供されませんが、近いです。まあ、バイナリを持つことはそれほど直交的ではないでしょう。これは、「1つの作業のための1つのツール」の原則(そして単純な原則の維持(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スケジューラ。次のように、ジョブが1時間以内に実行されるようにスケジュールできます。

echo "your_command" | at +1 hour

関連情報