2016-10-25 3 views
0

Ich habe ein Python-Skript, das verwendet wird, um Daten von einem Server zu sammeln. Ich kann es als laufen:Split Zeitintervall im Batch

./ApiStreamingClient.py -w flow-index -n admin -p admin localhost 1477389500000000000 1477389900000000000 | gzip - > out.gz 

wo 1477389500000000000 und 1477389900000000000 in Nanosekunden sind Zeit ein Intervall definieren.

Da der Dienst langsam ist, muss ich ein Bash-Skript schreiben, das den gleichen Code in Teilintervallen ausführt.

Dies ist mein aktueller Versuch, aber es gibt einige Fehler beim Kompilieren:

#!/bin/bash 

file_name=$1 
data_type=$2 
username=$3 
password=$4 
address=$5 
start_time=$6 
end_time=$7 

set batch_size = 1000000000 
set batch_start = start_time 
set batch_end = current_time + batch_size 

while (("$batch_end" < "$end_time")) 

do 

    echo "iteration $i batch_start=$batch_start batch_end=$batch_end" 
    ./$file_name -w flow-index -n $username -p $password $address $batch_start $batch_end | gzip > "out 
    set /a batch_start = batch_end + 1 
    set /a batch_end = batch_start + batch_size 
done 
~ 

Ich denke, der Fehler in ist, wie die while-Schleife definiert ist und in wie ich die batch_start und batch_end Variablen aktualisieren.

Können Sie mir bitte erklären, was mit diesem Code nicht stimmt? Mein Wissen o Bash ist nahe 0 und ich hätte gerne die funktionierende Version des Skripts und eine Erklärung der Probleme.

Thansk!

EDIT: ich immer noch Fehlermeldungen erhalten:

#!/bin/bash 

file_name=$1 
data_type=$2 
username=$3 
password=$4 
address=$5 
start_time=$6 
end_time=$7 

batch_size = 1000000000 
batch_start = $start_time 
batch_end = $((current_time + batch_size)) 


while (("$batch_end" < "$end_time$)) 
do 

    echo "iteration $i batch_start=$batch_start batch_end=$batch_end" 
    ./$file_name -w flow-index -n $username -p $password $address $batch_start $batch_end | gzip > "out_$i.gz" 
    batch_start =$((batch_end + 1)) 
    batch_end =$((batch_start + batch_size)) 
done 
~ 
~ 
~ 
~ 
~ 
~ 
~ 
~ 
~ 
~ 
~ 
~ 
~ 
~ 
~ 
~ 
~ 
~ 
~ 
~ 
~ 
~ 
~ 
~ 
probe27:/data/misC# 
probe27:/data/misC# 
probe27:/data/misC# 
probe27:/data/misC# 
probe27:/data/misC# sh GetStreamingFlowData.sh ApiStreamingClient.py -w flow-index -n admin -p admin localhost 1477389500000000000 1477389900000000000 
GetStreamingFlowData.sh: line 11: batch_size: command not found 
GetStreamingFlowData.sh: line 12: batch_start: command not found 
GetStreamingFlowData.sh: line 13: batch_end: command not found 
GetStreamingFlowData.sh: line 20: unexpected EOF while looking for matching `"' 
GetStreamingFlowData.sh: line 24: syntax error: unexpected end of file 
probe27:/data/misC# 
+0

Haben Sie darüber nachgedacht, dies in Python zu tun? Es wäre passender, da Python besser an Arithmetik angepasst ist und es vermeiden würde, Ihrem Prozess eine andere Sprache hinzuzufügen. Ich könnte mich irren, aber ich bin mir ziemlich sicher, selbst wenn du noch nie eine Zeile Python geschrieben hast, könntest du in der Lage sein, es in einem halben Tag zu lernen. – Aaron

+0

Glaubst du, es ist zu schwierig in bash? Ich bin mir nicht sicher, ob ich Python verwenden kann – Donbeo

+0

Nein, es ist einfach, wenn Sie das richtige Werkzeug verwenden, siehe meine Antwort :) Das Problem ist auf lange Sicht: Wenn etwas in Ihrer Lösung bricht, benötigen Sie möglicherweise eine Ressource, die weiß Python und eine Ressource, die bash kennt, um sie zu debuggen. Auch Bash ist viel weniger effizient als Python, und das Erstellen von mehreren Python-Prozess statt nur einer muss auch Zeit kosten. – Aaron

Antwort

0

Dies ist ein Job für seq:

start=1477389500000000000 
end=1477389900000000000 
step=1000000000 

for current_step in $(seq $start $step $end); do 
    echo $current_step 
done 
+0

Vielen Dank, um auch die Python-Lösung zu schreiben? – Donbeo

+0

Nun würde ich gerne, aber ich bin derzeit beschäftigt, und nicht vertraut mit Python, dass ich es in einer Minute tun könnte. Ich werde sehen, ob ich in den folgenden Stunden genug Zeit finde, aber Sie könnten auch eine andere Frage öffnen – Aaron

0

Sie haben die Syntax für einen Wert in eine Variable falsch zugeordnet werden. Sie schreiben eine bash Skript, keine DOS batch Datei.

#!/bin/bash 

file_name=$1 
data_type=$2 
username=$3 
password=$4 
address=$5 
start_time=$6 
end_time=$7 

batch_size=1000000000 
batch_start=$start_time 
batch_end=$((current_time + batch_size)) 

while (("$batch_end" < "$end_time")) 

do 

    echo "iteration $i batch_start=$batch_start batch_end=$batch_end" 
    ./$file_name -w flow-index -n "$username" -p "$password" "$address" "$batch_start" "$batch_end" | gzip -c > out 
    batch_start=$((batch_end + 1)) 
    batch_end=$((batch_start + batch_size)) 
done 
+0

Ich bekomme immer noch einige Fehler. Ich habe die Frage bearbeitet – Donbeo

+0

@Donbeo Sie haben zusätzliche Leerzeichen: 'Variable = Wert' bricht,' Variable = Wert' oder 'Variable = Wert' arbeiten – Aaron