PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bash script - Hilfe (u.a. exec...)



Mat
14-08-2007, 18:53
Hallo,
ich würde gern ein bash-script schreiben welches mir ungefähr die Zeit die eine Anwendung mit einem Input braucht ausgibt: Dazu:
will ich ein programm welches 2 parameter bekommt mehrfach (ca. 100) starten in einer for-schleife und über den time befehl die ergebnisse einlesen, daraus 16% der grössten und kleinsten zeiten löschen und aus allen anderen den Mittelwert berechnen.

Leider scheitere ich bereits am exec command, die anwendung startet nur 1mal.

Hier mein erster versuch:



#!/bin/bash


#Global variables
EXEC_COMMAND="time /home/pfad/zu/programm"
DATA_PATH="/pfad/zu/Daten/"
DATA="data_input"
INPUT_FLAGS="-2"


echo ""
echo "##############################"
echo "######### Starting ###########"



for (( i = 0; i < 3; i++ ))
do
echo "Starting iteration " $i
exec $EXEC_COMMAND $DATA_PATH$DATA $INPUT_FLAGS
done



echo "### SUCCESSFULLY FINISHED ####"
echo "##############################"
echo ""

bischi
14-08-2007, 18:56
Wieso exec? Starte das Programm doch einfach ganz normal, warte bis es zu Ende ist und starte es neu (halt so, wie man immer Programme von der Kommandozeile aus startet...)

MfG Bischi

Mat
14-08-2007, 19:09
ahja ok....

mein nächstes problem ist das speichern in ein array:
ich mache das im moment so aber es kommt nicht das dabei raus was ich will:


for (( i = 0; i < 3; i++ ))
do
echo "Starting iteration " $i
$EXEC_COMMAND $DATA_PATH$DATA $INPUT_FLAGS > res[$i]
done



for (( i = 0; i < 3; i++))
do
echo ${res[${i}]}
done

jan61
14-08-2007, 20:59
...mein nächstes problem ist das speichern in ein array:
ich mache das im moment so aber es kommt nicht das dabei raus was ich will:


for (( i = 0; i < 3; i++ ))
do
echo "Starting iteration " $i
$EXEC_COMMAND $DATA_PATH$DATA $INPUT_FLAGS > res[$i]
done



for (( i = 0; i < 3; i++))
do
echo ${res[${i}]}
done



Zum exec noch eine kleine Erklärung: exec macht keinen fork, sondern ersetzt das Prozessabbild Deines aufrufenden Programms durch das des per exec gestarteten. Im Klartext: Mit Deinem ersten exec ist Dein Shell-Script zu Ende.

Zum aktuellen Problem: Kein Wunder, Du leitest die Ausgabe von EXEC_COMMAND um, nicht die von time. Ich empfehle mal den Aufruf von
man time da steht die Erklärung dafür. Die GNU-Version von time kennt die Option -o, um die Ausgabe in eine Datei umzuleiten, außerdem ist -f nützlich, damit Du die gewünschte Ausgabe so formatieren kannst, wie Du es brauchst.

Jan

P.S.: Was mir erst hinterher aufgefallen ist: Du kannst keine Ausgabeumleitung in eine Variable machen, das geht nur in eine Datei (die kann nat. auch eine Pipe o. a. sein). Wenn Du stdout eines Kommandos in einer Variable haben willst, dann musst Du das wie folgt machen:
res[$i]=`ls` # alle Shells
res[$i]=$(ls) # nur bashAch ja - noch was: Mit Deiner Schleifenkonstruktion nagelst Du Dich auch auf die bash fest. Andere Shells (sh, ksh) kennen diese Konstruktion nicht. Shell-Typisch wäre eher so was:
for i in `seq 1 3`; do ...
# oder
for i in 1 2 3; do ...