Druckausführungszeit eines Shell-Befehls

84

Ist es möglich, die Ausführungszeit eines Shell-Befehls mit der folgenden Kombination zu drucken?

root@hostname:~# "command to execute" && echo "execution time"
Jack
quelle

Antworten:

70

Vergessen Sie nicht, dass es einen Unterschied zwischen dem eingebauten Bash gibt time(der standardmäßig aufgerufen werden sollte, wenn Sie dies tun time command) und /usr/bin/time(bei dem Sie ihn auf seinem vollständigen Pfad aufrufen müssen).

Das integrierte Programm timedruckt immer in stderr, /usr/bin/timeermöglicht es Ihnen jedoch, die Zeitausgabe an eine bestimmte Datei zu senden, damit Sie den stderr-Stream des ausgeführten Befehls nicht stören. Auch /usr/bin/time‚s - Format konfigurierbar ist in der Befehlszeile oder von der Umgebungsvariablen TIME, während heftiger Schlag des builtin timeFormat wird nur durch die konfigurierte TIMEFORMATUmgebungsvariable.

$ time factor 1234567889234567891 # builtin
1234567889234567891: 142662263 8653780357

real    0m3.194s
user    0m1.596s
sys 0m0.004s
$ /usr/bin/time factor 1234567889234567891
1234567889234567891: 142662263 8653780357
1.54user 0.00system 0:02.69elapsed 57%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+215minor)pagefaults 0swaps
$ /usr/bin/time -o timed factor 1234567889234567891 # log to file `timed`
1234567889234567891: 142662263 8653780357
$ cat timed
1.56user 0.02system 0:02.49elapsed 63%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+217minor)pagefaults 0swaps
Mark Rushakoff
quelle
Von man bash: "Die Variable TIMEFORMAT kann auf eine Formatzeichenfolge festgelegt werden, die angibt, wie die Zeitinformationen angezeigt werden sollen."
Bis auf weiteres angehalten.
Hoppla - Ich dachte, es gäbe eine Möglichkeit, es zu formatieren, aber ich habe es verpasst, help timeweil ich nur einen Blick darauf geworfen habe und dachte, es sei ein Befehlszeilenargument. Ich werde die Antwort aktualisieren.
Mark Rushakoff
2
Hier sind wir 9 Jahre später und der Befehl dauerte nur 0m0.018s. Ich dachte nur, ich würde darauf hinweisen.
Ghassen Louhaichi
111

time ist ein in den meisten Shells integrierter Befehl, der Ausführungszeitinformationen in das tty schreibt.

Sie könnten auch so etwas versuchen

start_time=`date +%s`
<command-to-execute>
end_time=`date +%s`
echo execution time was `expr $end_time - $start_time` s.

Oder in bash:

start_time=`date +%s`
<command-to-execute> && echo run time is $(expr `date +%s` - $start_time) s
Mob
quelle
In Übereinstimmung mit Maaza ermöglichte mir diese Flexibilität, die Zeit einer ganzen Reihe von Befehlen zu messen.
Nath
Ist es möglich, Linux-Aspekte um jeden Linux-Befehl anzuwenden, um die Ausführung zu berechnen
Syed Mazreena
1
Ein Nachteil dieses Ansatzes besteht darin, dass er in Sekunden misst, während timeMillisekunden verwendet werden. Und wenn Sie eine Handvoll Befehle zusammen zeitlich festlegen möchten, ohne Variablen und Berechnungen verwenden zu müssen, können Sie Klammern verwenden: time ( command1 ; command2 ; command3 )Sie können sie sogar einzeln zusammen mit einer Gesamtzeit zeitlich festlegen, wie folgt: time ( time command1 ; time command2 ; time command3 ) Wenn Sie etwa zwanzig Befehle wünschen, können Sie dies natürlich tun Verwenden Sie besser die Lösung dieser Antwort. Aber dann sollten Sie darüber nachdenken, Ihre Befehle alle in ein Skript zu schreiben ...
msb
24
root@hostname:~# time [command]

Es wird auch zwischen der verwendeten Echtzeit und der verwendeten Systemzeit unterschieden.

Jason
quelle
Das ist sicherlich die grundlegende Antwort - aber es gibt einige Komplikationen, wenn Sie die Fehlerausgabe des Befehls sehen und dennoch die Timing-Informationen wie in der Frage an die Standardausgabe senden möchten. Der Befehl time schreibt in stderr. Was Sie vorschlagen, ist wahrscheinlich genau genug - daher meine +1.
Jonathan Leffler
2
timeschreibt an die tty, nicht an stderr. Was ich denke, macht die Sache noch schlimmer.
Mob
12

Versuchen Sie für eine zeilenweise Delta-Messung gnonom .

Es ist ein Befehlszeilenprogramm, ähnlich wie bei moreutils, um der Standardausgabe eines anderen Befehls Zeitstempelinformationen voranzustellen. Nützlich für lang laufende Prozesse, bei denen Sie eine historische Aufzeichnung dessen wünschen, was so lange dauert.

Wenn Sie etwas an gnomon weiterleiten, wird jeder Zeile ein Zeitstempel vorangestellt, der angibt, wie lange diese Zeile die letzte Zeile im Puffer war - dh wie lange es gedauert hat, bis die nächste Zeile angezeigt wurde. Standardmäßig zeigt gnomon die zwischen den einzelnen Zeilen verstrichenen Sekunden an, dies ist jedoch konfigurierbar.

Gnomon Demo

Janus Troelsen
quelle
8

Zur Antwort von @ mob hinzufügen:

Das Anhängen %Nan date +%sgibt uns eine Genauigkeit von Nanosekunden:

start=`date +%s%N`;<command>;end=`date +%s%N`;echo `expr $end - $start`
nav
quelle
5

Wenn ich einen lang laufenden Prozess wie eine Kopie oder einen Hash starte und später wissen möchte, wie lange es gedauert hat, mache ich einfach Folgendes:

$ date; sha1sum reallybigfile.txt; date

Was zu folgender Ausgabe führt:

Tue Jun  2 21:16:03 PDT 2015
5089a8e475cc41b2672982f690e5221469390bc0  reallybigfile.txt
Tue Jun  2 21:33:54 PDT 2015

Zugegeben, wie hier implementiert, ist es nicht sehr genau und berechnet nicht die verstrichene Zeit. Aber es ist einfach und manchmal alles was man braucht.

Ethan
quelle
4

In zsh können Sie verwenden

=time ...

In bash oder zsh können Sie verwenden

command time ...

Diese (durch verschiedene Mechanismen) erzwingen die Verwendung eines externen Befehls.

überRegenbogen
quelle
0

Gerade ps -o etime= -p "<your_process_pid>"

Alejandro Galera
quelle