Ist es möglich, die Ausführungszeit eines Shell-Befehls mit der folgenden Kombination zu drucken?
root@hostname:~# "command to execute" && echo "execution time"
Antworten:
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 time
druckt immer in stderr, /usr/bin/time
ermö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 time
Format wird nur durch die konfigurierte TIMEFORMAT
Umgebungsvariable.
$ 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
help time
weil ich nur einen Blick darauf geworfen habe und dachte, es sei ein Befehlszeilenargument. Ich werde die Antwort aktualisieren.
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
time
Millisekunden 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 ...
root@hostname:~# time [command]
Es wird auch zwischen der verwendeten Echtzeit und der verwendeten Systemzeit unterschieden.
time
schreibt an die tty, nicht an stderr. Was ich denke, macht die Sache noch schlimmer.
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.
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.
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.
Gerade ps -o etime= -p "<your_process_pid>"
man bash
: "Die Variable TIMEFORMAT kann auf eine Formatzeichenfolge festgelegt werden, die angibt, wie die Zeitinformationen angezeigt werden sollen."