Leichtes Dienstprogramm / Programm zum Ausführen eines Befehls nach einer zufälligen Verzögerung


7

Ich muss die Zeit vor dem Start eines bestimmten Befehls zufällig festlegen. Mir ist klar, dass es relativ trivial ist, dies innerhalb eines Skripts zu tun oder ein "Wrapper" -Skript zu schreiben, um dies zu tun, aber ich frage mich, ob jemand ein leichtes Binärprogramm kennt, das bereits verfügbar ist, um dies zu erreichen, ohne dass ein Interpreter erforderlich ist geladen.

EDIT: Genauer gesagt, ich möchte Bash in keiner Weise einbeziehen. Nehmen wir aus Gründen der Argumentation an, dass keine Shell verfügbar ist, und rufe dies von einem nicht interaktiven Programm aus auf.

Antworten:


4

Wenn Sie eine feinkörnigere Kontrolle wünschen als die netten Bash-Beschwörungsformeln von maxschlepzig , ist es ziemlich einfach, einfach zu codieren:

#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;
}

Kompilieren Sie mit etwas wie gcc randomdelay.c -o randomdelayund rufen Sie es wie auf

$ randomdelay 10000 echo Hi!

Wenn Sie dies als Programmierkontext tun, ist es möglicherweise besser, nur den Teil des Codes zu greifen, der die zufällige Verzögerung für Sie auswählt und eine execFamilienfunktion aufruft (welche Sie möchten, hängt davon ab, wie genau Sie sie intern angegeben haben).

Ausgabe hier:

  • Dies setzt voraus , Ihre Systeme rand/ srandgesund sind (nicht gut PRNGs Sie etwas dagegen , nur , dass sie das tun , was der Mann Seite sagt , sie tun). Ich habe einige Probleme damit auf meiner Mac OS X-Box, wo diese Funktionen zugunsten von random/ veraltet sind srandom.
  • In der randVergangenheit hatten viele Implementierungen schlechte numerische Eigenschaften. Das sollte in dieser Anwendung kein Problem sein, aber wenn ja, ersetzen Sie es durch ein besseres PRNG.
  • Die Behandlung von Befehlszeilenargumenten in diesem Spielzeug ist etwas primitiv.
  • Die Verzögerung wird aus einem bestimmten Bereich gleichmäßig gewählt. Für einige Anwendungen bevorzugen Sie möglicherweise eine unbegrenzte Verteilung wie eine Exponentialverteilung. Der Stapelüberlauf hat viele Fragen, wie ungleichmäßige Verteilungen von einheitlichen PRNGs erhalten werden können.

Genau darüber habe ich gesprochen! Vielen Dank!!
LawrenceC

Sie könnten die Familie * rand48 () anstelle von rand () verwenden.
JFS

6

In bashkönnen Sie es so machen:

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

Warten Sie also zwischen 0 und 2 Sekunden, bevor Sie den Befehl ausführen. Oder wählen Sie ein anderes Intervall.

Oder wenn $RANDOMnicht verfügbar, können Sie versuchen jot:

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

Sicher, das zufällige Warten plus Ausführen wird nicht durch eine einzelne Binärdatei bereitgestellt, sondern wird geschlossen. Nun, eine einzelne Binärdatei wäre weniger orthogonal, sie würde irgendwie gegen das One-Tool-for-One-Job-Prinzip (und das Keep-it-Simple-Prinzip (KISS)) verstoßen.


1

Das einfachste ist der sleepBefehl. Um Ihr Programm in zehn Sekunden auszuführen, gehen Sie wie folgt vor:

sleep 10 && your_command

Als nächstes, wenn Sie etwas mehr Raffinesse benötigen, wäre der atScheduler. Sie können eine Aufgabe so planen, dass sie in einer Stunde ausgeführt wird:

echo "your_command" | at +1 hour

Dies ist jedoch keine zufällige Zeitangabe (ich stelle mir vor, Sie könnten es leicht genug schaffen $RANDOM). Es klingt auch wie die "Skript" -Methode, die er vermeiden möchte - er möchte eine Binärdatei, die dies aus irgendeinem Grund tut
Michael Mrozek

Ich war blind für das Wort "zufällig", als ich die Frage redete. Schlaf würde immer noch funktionieren, wenn Sie ihm eine Zufallszahl geben.
Caleb
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.