Ich möchte die Fertigstellungszeit eines Skripts anzeigen.
Was ich derzeit mache, ist -
#!/bin/bash
date ## echo the date at start
# the script contents
date ## echo the date at end
Dies zeigt nur den Zeitpunkt des Beginns und Endes des Skripts. Wäre es möglich, eine feinkörnige Ausgabe wie Prozessorzeit / Io-Zeit usw. anzuzeigen?
Antworten:
Verwenden
time
Sie einfach, wenn Sie das Skript aufrufen:quelle
real
,user
undsys
. Die Bedeutung dieser finden Sie hier .time $( ... ) >> out.txt
time (command1 && command2)
Wenn
time
keine Option ist,quelle
date
beispielsweise immer noch zweimal auf, sodass Sie in der Praxis bestenfalls Millisekundengenauigkeit und wahrscheinlich auch weniger erhalten)date +%s.%N
. (%N
ist Nanosekunden seit der ganzen Sekunde.)date +%s%N
, oder verwenden Sie eine leistungsfähigerebc
Methode, um die tatsächliche Laufzeit aus den beiden Werten zu berechnen, wie von jwchew vorgeschlagen. Trotzdem halte ich diesen Ansatz für eine suboptimale Methode.time
ist aus den oben genannten Gründen erheblich besser, wenn sie verfügbar ist.bc
und dann wieruntime=$( echo "$end - $start" | bc -l )
echo "Duration: $((($(date +%s)-$start)/60)) minutes
Rufen Sie einfach
times
beim Beenden Ihres Skripts ohne Argumente auf.Mit
ksh
oderzsh
können Sie auchtime
stattdessen verwenden. Mitzsh
,time
geben Sie neben der Benutzer- und System- CPU-Zeit auch die Uhrzeit der Wanduhr an .Um den Beendigungsstatus Ihres Skripts beizubehalten, können Sie Folgendes festlegen:
Oder Sie können auch eine Falle hinzufügen
EXIT
:Auf diese Weise werden Zeiten aufgerufen, wenn die Shell beendet wird und der Beendigungsstatus beibehalten wird.
Beachten Sie auch , dass alle
bash
,ksh
undzsh
hat eine$SECONDS
spezielle Variable , die automatisch jede Sekunde erhöht werden. In beidezsh
undksh93
kann diese Variable auch Floating - Point vorgenommen werden (mittypeset -F SECONDS
) mehr Präzision zu erhalten. Dies ist nur die Wanduhrzeit, nicht die CPU-Zeit.quelle
time
zuvor vorgestellten Ansatzes. - - Ich denke, dertimeit
in MATLAB-Code vorgestellte Ansatz kann hier nützlich sein.times
es keine Wandzeit gibt, oder? Beispiel:bash -c 'trap times EXIT;sleep 2'
Ich bin ein bisschen spät dran am Zug, wollte aber meine Lösung posten (für eine Genauigkeit von weniger als einer Sekunde), falls andere durch die Suche auf diesen Thread stoßen. Die Ausgabe erfolgt im Format Tage, Stunden, Minuten und zuletzt Sekunden:
Hoffe, jemand da draußen findet das nützlich!
quelle
date
keine Genauigkeit von weniger als einer Sekunde unterstützen und lediglich ein wörtliches "N
" an den Zeitstempel anhängen .dt2=$(echo "$dt%86400" | bc)
. Ich sage nur ... Übrigens bevorzuge ich die Form,dt2=$(bc <<< "${dt}%86400")
aber das ist ganz persönlich.Meine Methode für
bash
:quelle
Ja, das nennt sich Python, aber wenn Sie damit leben können, dann ist dies eine nette, knappe Lösung.
quelle
python
Beachten Sie, dass das Ausführen dieses Befehls in einer Subshell und das Lesen seiner Ausgabe auf den meisten aktuellen Systemen mehrere Millionen Nanosekunden dauert. Gleiches gilt fürs Laufendate
.Diese Frage ist ziemlich alt, aber als ich versuchte, meine Lieblingsmethode zu finden, kam dieser Thread hoch ... und ich bin überrascht, dass niemand darauf eingegangen ist:
'perf' ist ein Tool zur Leistungsanalyse, das im Kernel unter 'tools / perf' enthalten ist und oft als separates Paket installiert werden kann ('perf' in CentOS und 'linux-tools' unter Debian / Ubuntu). Das Linux Kernal Perf Wiki enthält viel mehr Informationen dazu.
Das Ausführen von 'perf stat' enthält eine ganze Reihe von Details, einschließlich der durchschnittlichen Ausführungszeit am Ende:
quelle
perf
?perf stat
beschwert sich jetzt über "Sie haben möglicherweise nicht die Erlaubnis, Statistiken zu sammeln." es sei denn, Sie führen einige Befehle mit aussudo
, wodurch es in allen Szenarien, in denen Sie den Zielcomputer nicht vollständig besitzen, unbrauchbar wird.Eine kleine Shell-Funktion, die vor Befehlen hinzugefügt werden kann, um ihre Zeit zu messen:
Verwenden Sie es dann in Ihrem Skript oder in Ihrer Befehlszeile wie folgt:
quelle
s=$(date +%s000)
, nicht sicher, ob es funktioniert.Hier ist eine Variation von Alex 'Antwort. Ich kümmere mich nur um Minuten und Sekunden, aber ich wollte es auch anders formatieren. Also habe ich das gemacht:
quelle
quelle
date
vor und nach dem Skript verwendet werden und die den Unterschied zwischen ihnen ausgeben?Mit nur bash ist es auch möglich, die Zeitdauer für einen Teil des Shell-Skripts (oder die verstrichene Zeit für das gesamte Skript) zu messen und zu berechnen :
Sie können jetzt entweder nur den Unterschied drucken:
Wenn Sie nur eine inkrementelle Dauer benötigen, gehen Sie wie folgt vor:
Sie können die Dauer auch in einer Variablen speichern:
quelle
Persönlich möchte ich meinen gesamten Skriptcode in eine "Haupt" -Funktion einbetten:
Beachten Sie, wie einfach die Verwendung des
time
Befehls in diesem Szenario ist. Natürlich messen Sie nicht die genaue Zeit einschließlich der Skriptanalysezeit, aber ich finde sie in den meisten Situationen genau genug.quelle
quelle
Die Timing-Funktion
SECONDS
, die auf der Second-Level-Granularität basiert , verwendet keine externen Befehle:Zum Beispiel:
gibt
quelle