Verstrichene Zeit in Bash

Ich möchte an einer Stelle in einem Skript Folgendes tun:

start_time=date 

und dies, nachdem ein oder mehrere Prozesse ausgeführt wurden:

end_time=date 

und führen Sie dann Folgendes aus:

elapsed=$end_time-$start_time echo "Total of $elapsed seconds elapsed for process" 

Wie würde ich das machen?

Kommentare

Antwort

Verwenden Sie die Zeit seit der Epoche, um eine Zeitspanne in einem Skript leicht zu identifizieren.

man date %s seconds since 1970-01-01 00:00:00 UTC %N nanoseconds (000000000..999999999) 

.

start_time="$(date -u +%s)" sleep 5 end_time="$(date -u +%s)" elapsed="$(($end_time-$start_time))" echo "Total of $elapsed seconds elapsed for process" Total of 5 seconds elapsed for process 

Bash unterstützt keine Gleitkommazahlen, daher müssen Sie ein externes Tool wie bc verwenden, um Zeiten wie zu vergleichen 1475705058.042270582-1475705053.040524971

start_time="$(date -u +%s.%N)" sleep 5 end_time="$(date -u +%s.%N)" elapsed="$(bc <<<"$end_time-$start_time")" echo "Total of $elapsed seconds elapsed for process" Total of 5.001884264 seconds elapsed for process 

Kommentare

  • das ist was Ich habe gesucht .. kann dies Mikrozeit einschließen?
  • Versuchen Sie date '+%s.%N'
  • Sie sollten das Datum mit date -u aufrufen, um Sommerzeit und lokale Probleme mit dem Befehl zu vermeiden. Bitte lesen Sie diese Antwort
  • Da (traditionell) bc mit dc implementiert ist, können Sie dc direkt verwenden: elapsed=$(dc -e "$end_time $start_time - p")

Antwort

bash hat eine integrierte Timer-Variable

start=$SECONDS # do stuff end=$SECONDS duration=$(( end - start )) echo "stuff took $duration seconds to complete" 

Kommentare

  • Oder SECONDS=0; ...; echo "$SECONDS". Passen Sie jedoch auf diesen Fehler auf.

Antwort

@jasonwryan hat es bereits vorgeschlagen, aber ich werde es als Antwort einwerfen, da es auch meine Anlaufstelle ist, wenn ich ein Skript zeitlich festlegen möchte. Um myscript zeitlich festzulegen, verwenden Sie einfach:

time myscript 

Kommentare

  • Ich werde dies von Zeit zu Zeit versuchen, aber dies ist mehr, wenn ich muss Unterabschnitte meines Skripts isolieren oder zeitlich festlegen.
  • Dies ist nicht hilfreich, wenn Sie die abgeleitete verstrichene Zeit im Skript selbst verwenden möchten, z. B. um zu berechnen, wie viele Einheiten das Skript pro Sekunde verarbeiten konnte .

Antwort

Ich mag die Antwort von @Miata, weil sie die Aufmerksamkeit auf Lösung. @Miata enthält jedoch .%N, aber ich bin nicht sicher, welchen Nutzen Sie für Nanosekunden haben, wenn die Kosten für die Ausführung von date anfallen Befehl in einer Unterschale. In der Praxis sollte also date +%s ausreichend sein. Die andere Sache zu beachten ist date +%s Epoche ist 1970-01-01 00:00:00 UTC. Das heißt, die Zeit hat eine absolute Epoche und Sie können die Zeitmessung zwischen verschiedenen Instanzen von Shell-Skripten oder verschiedenen Maschinen teilen.

(( start=$(date +%s) )) # 1604026743 # ... some activity that lasts for, say, 24 seconds (( end=$(date -u +%s) )) # 1604026767 (( duration=end-start )) # 24 

Ich mag @glenn jackman “ s Antwort, weil sie sich auf die integrierte Variable SECONDS bash bezieht. Hier ist zu beachten, dass die Epoche der Zeitpunkt ist, zu dem der Prozess gestartet wurde. Daher können wir diese Technik nur verwenden, um Messen Sie die Zeiten für Dinge, die in diesem Skript passieren:

(( start=SECONDS )) # 10 # ... some activity that lasts for, say, 24 seconds (( end=SECONDS )) # 34 (( duration=end-start )) # 24 

Eine andere Sache ist, dass ich alle meine Zuweisungen in die (( )) Befehl, dh Sie können Folgendes umschreiben:

cmd=$(( some_expression )) 

als

(( cmd=some_expression )) 

Auf diese Weise können wir das Auftreten des Symbols $ minimieren.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.