it-swarm.com.de

Ausführungszeit eines Shell-Befehls drucken

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

[email protected]:~# "command to execute" && echo "execution time"
72
jack

Vergessen Sie nicht, dass es einen Unterschied gibt zwischen der eingebauten time von bash (die standardmäßig aufgerufen werden sollte, wenn Sie time command ausführen) und /usr/bin/time (für den Sie den vollständigen Pfad angeben müssen).

Die eingebaute Variable time druckt immer in stderr, aber mit /usr/bin/time können Sie die Ausgabe der Uhrzeit an eine bestimmte Datei senden, sodass der stderr-Stream des ausgeführten Befehls nicht beeinträchtigt wird. Außerdem ist das Format von /usr/bin/time in der Befehlszeile oder über die Umgebungsvariable TIME konfigurierbar, während das eingebaute time-Format von bash only durch die Umgebungsvariable TIMEFORMAT konfiguriert ist.

$ 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
63
Mark Rushakoff

time ist ein integrierter Befehl in den meisten Shells, der Informationen zur Ausführungszeit 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
96
mob
[email protected]:~# time [command]

Es unterscheidet auch zwischen der verwendeten Echtzeit und der verwendeten Systemzeit.

23
Jason

Versuchen Sie für eine zeilenweise Deltamessung gnonom .

Es ist ein Kommandozeilen-Dienstprogramm, ein bisschen wie moreutils 's, 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, d. H. Wie lange es dauerte, bis die nächste Zeile auftauchte. Standardmäßig zeigt gnomon die Sekunden an, die zwischen den einzelnen Zeilen vergangen sind. Dies ist jedoch konfigurierbar.

 gnomon demo

10
Janus Troelsen

Hinzufügen zu @ mob's Antwort:

Durch das Anhängen von %N an date +%s erhalten Sie eine Genauigkeit von Nanosekunden:

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

Wenn ich einen langwierigen Prozess wie eine Kopie oder einen Hashvorgang beginne 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 präzise und berechnet nicht die abgelaufene Zeit. Aber es ist schmutzig und manchmal alles, was Sie brauchen.

4
Ethan

In zsh kannst du verwenden

=time ...

In Bash oder Zsh können Sie verwenden

command time ...

Diese erzwingen (durch verschiedene Mechanismen), dass ein externer Befehl verwendet wird.

3
überRegenbogen

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

0
mulg0r