Hallo,
ich bräuchte mal schnell Hilfe.
(Keine Zeit für Internet-Recherche)
In Linux habe ich ein ausführbares Programm, das mit ein paar Parametern
aufgerufen wird.
1
./myProgram -a foo -b bar
Das Programm soll für eine Performance-Messung i-mal aufgerufen werden.
Dabei soll der Parameter -b immer andere Müll-daten von 16Byte Größe
erhalten.
Also, ich bräuchte dafür ein kleines Skript.
Es wäre natürlich am schönsten, wenn die Müll-daten in einer separaten
Datei gespeichert und ausgelesen werden; das muss aber nicht sein. Die
Daten können auch als zig Variablen direkt im Skript stehen.
Wer kann mir ein paar Tipps geben, oder das Skript schnell hinschreiben?
DANKE
embert schrieb:> In Linux habe ich ein ausführbares Programm, das mit ein paar Parametern> aufgerufen wird../myProgram -a foo -b barDas Programm soll für eine> Performance-Messung i-mal aufgerufen werden.> Dabei soll der Parameter -b immer andere Müll-daten von 16Byte Größe> erhalten.
Was heisst Mülldaten? Hast du die Daten schon generiert oder kann
das einfach Zufallsdaten sein? Sollen das immer die gleichen sein
oder wirklich egal was dort steht?
Die bytes unten sind rohe bytes keine Hexstrings.
#!/bin/bash
max=100
for i in {1..$max}
do
myprogramm -a foo -b "$(head -c 16 /dev/urandom)"
done
Danke, Altenpfleger.
Nein, /dev/urandom geht leider nicht.
Es sollen nämlich zwei verschiedene Programme mit den gleichen Daten
getestet werden, damit ausgeschlossen ist, dass die Daten etwas mit der
Laufzeit zu tun haben.
Aber die Müll-daten können und sollen initial als Random angelegt
werden. Daher die Idee die Daten aus einer separaten Datei auszulesen.
Wie sieht denn das Datenformat genau aus?
Wird das erst noch festgelegt oder ist das schon fest?
Ich würde die Daten als Hexstring speichern, das lässt sich einfacher
per Script zeilenweise auslesen und kann auch mal mit nem Editor schnell
was ändern.
Wenn die Programme per Kommandozielenschalter die Daten raw haben wollen
oder wie auch immer kann man sie voher noch entspr. einfach
konvertieren, mit od/hd geht das einfach oder man nimmt perl und das
eingebaute pack, php hat das auch schon drinn.
Also sag mal was deine zwei Programme für ein Format erwarten.
Du kannst die Mülldaten in der Bash mit der Environment-Variable RANDOM
zusammenbasteln und zu Beginn des Skripts RANDOM mit einem festen Wert
initialisieren. Dann liefert RANDOM bei jedem Skriptaufruf dieselbe
Zahlenfolge.
embert schrieb:> Ich denke, das sind Hex-Daten als String, oder?
Ja, welches Format 'myprogramm' und das andere haben müssen möchte ich
gerne wissen, dementspr. wird das Script und die Generierung augebaut.
Altenpfleger schrieb:> Ja, welches Format 'myprogramm' und das andere haben müssen möchte ich> gerne wissen, dementspr. wird das Script und die Generierung augebaut.
Das verstehe ich gerade nicht.
Wie gesagt, es handelt sich um ein ausführbares C-Programm, das bereits
existiert.
Was der intern macht ist doch ziemlich wurscht.
Durch den Programmaufruf sieht man doch, dass er Hex-Daten frisst, die
er als String einliest, oder?
Hallo und Danke,
generieren möchte ich die Daten, wie gesagt, nur einmal und dann für
unterschiedliche Programme mehrfach die selben verwenden.
Kannst du mir deinen Einzeiler nochmal etwas aufbröseln?
Für die Performance-Messung wollte ich clock_gettime() in den Code
eincompilieren, und die Zeit einfach ausgeben lassen. Das soll das
genaueste sein.
embert schrieb:> Kannst du mir deinen Einzeiler nochmal etwas aufbröseln?
1
time while IFS= read -r line; do ./myProgram -a foo -b "$line"; done < /pfad/zu/datei/mit/zufallsdaten
time misst die Zeit, die ein Prozess verbraucht hat, im oberen Beispiel
ist das der while-loop. Der while-loop in bash nutzt das nachfolgende
Kommando als Bedingung, und führt dies vor jedem Schleifendurchlauf aus.
Wenn das Programm mit einem Status beendet wird, der nicht 0 ist, wird
die Schleife abgebrochen. Das Kommando "read", welches ein shell-builtin
ist, mit dem Argument "line", liest die nächste Zeile vom Standard Input
ein, und speichert diese in der Environment Variable "line". Wenn kein
Newline gefunden wird gibt read einen Status zurück der nicht 0 ist. Das
Semikolon (;) markiert das Ende des Kommandos, und kann auch durch eine
neue Zeile ersetzt werden. "do" zeigt den Anfang des Schleifenrumpfes
an, und "done" das ende davon. Die Kommandos im Schleifenrumpfes werden
bei jedem Schleifendurchlauf ausgeführt, hier also './myProgram -a foo
-b "$line"'. Durch das '$' Zeichen vor "line" wird "line" als Variable
behandelt und dessen Wert vor dem Ausführen an der stelle eingesetzt.
Die Anfürungszeichen '"' verhindern, dass Zeichen des IFS, z.B. Abstände
im Wert der Variable "line", gesondert behandelt werden, also nicht
zusammengefasst werden, und das Argument nicht in mehrere unterteilt
werden kann. Das Kleinerals zeichen "<" öffnet die nachfolgende Datei,
hier "/pfad/zu/datei/mit/zufallsdaten" zum lesen für den Ausdruck, der
Links davon steht, hier die while-schleife. Die While schleife bekommt
deshalb einen eigenen Prozess, eine sogenannte subshell, und der
Standard Input dieser Subshell, und somit aller darin ausgeführten
gestarteten Prozesse, ist die zum lesen geöffnete Datei. Deshalb liest
diese Schleife die Datei Zeile für Zeile aus und speichert die Zeile in
"line", bevor der die Befehle im Schleifenrumpf abgearbeitet werden.