it-swarm.com.de

Wie lange dauert es, bis ein Befehl ausgeführt wird?

Wie würden Sie herausfinden, wie lange ein laufender Prozess gedauert hat?

Beispiel:

 date; dd bs=1m if=/foo of=bar; date

^ Dieses Beispiel hat nur eine Auflösung von 1 Sekunde.

Jede Shell ist akzeptabel.

34
spuder

benutze time:

$ time longrunningcommand --takeyourtime

time führt den Rest der Befehlszeile als Befehl aus (in diesem Beispiel longrunningcommand --takeyourtime) und gibt nach Ablauf des Befehls die verstrichene Zeit aus.

ein weiteres Beispiel: time foo --bar führt foo --bar aus und wartet, bis es beendet ist. Anschließend wird die verstrichene Zeit gedruckt.

time ist in den meisten Shells ein eingebauter Befehl. Der Unterschied zwischen der eingebauten Shell und dem Systembefehl ist hauptsächlich das Format der Ausgabe. Weitere Informationen zu den Unterschieden finden Sie weiter unten.

wenn Sie das System time verwenden möchten, gehen Sie folgendermaßen vor:

$ /usr/bin/time longrunningcommand --getsomecoffee

oder so:

$ \time longrunningcommand --callmom
$ command time longrunningcommand --callmom

der Backslash funktioniert in Bash und vielleicht einigen anderen Shells. command funktioniert in den meisten Shells.


ausführlichere Beispiele

beispiel longrunningcommand:

#!/bin/sh

echosleep() {
  seq $1 | while read tick; do
    echo $tick
    sleep 1
  done
  echo done
}

case $1 in
  --takeyourtime) echosleep 4 ;;
  --getsomecoffee) echosleep 5 ;;
  --callmom) echosleep 6 ;;
  *) echo wat ;;
esac

beispielaufruf:

$ ./longrunningcommand --takeyourtime
1
2
3
4
done

(mit Verzögerung zwischen jeder Ausgabezeile)

beispielaufruf mit bash integrierter time:

$ time ./longrunningcommand --getsomecoffee
1
2
3
4
5
done

real    0m5,020s
user    0m0,010s
sys 0m0,010s

die interessante Information ist real 0m5,020s. Weitere Informationen zu den anderen Nummern finden Sie hier: https://stackoverflow.com/questions/556405/what-do-real-user-and-sys-mean-in-the-output-of-time1

beispielaufruf mit System time:

$ \time ./longrunningcommand --callmom
1
2
3
4
5
6
done
0.00user 0.01system 0:06.02elapsed 0%CPU (0avgtext+0avgdata 3656maxresident)k
0inputs+0outputs (0major+1089minor)pagefaults 0swaps

die interessante Information ist 0:06.02elapsed. Für die Bedeutung der anderen Zahlen lesen Sie die Manpage von time: http://man7.org/linux/man-pages/man1/time.1.html

sie können die Ausgabe des Systems time ändern. beobachten:

$ \time sleep 0.5
0.00user 0.00system 0:00.50elapsed 0%CPU (0avgtext+0avgdata 2376maxresident)k
0inputs+0outputs (0major+81minor)pagefaults 0swaps
$ \time -p sleep 0.5
real 0.50
user 0.00
sys 0.00
$ \time -f %E sleep 0.5
0:00.50

wie man die Ausgabe umleitet oder erfasst

zur Demonstration den Befehl hellostdoutstderr beachten:

#!/bin/sh
sleep 0.5
echo stdout
echo stderr >&2

beispielaufrufe:

 $ ./hellostdoutstderr 
stdout
stderr
$ ./hellostdoutstderr >stdout 2>stderr
$ cat stdout
stdout
$ cat stderr
stderr

das eingebaute Bash time druckt das Terminal, auch wenn stdout und stderr umgeleitet werden, da es ein eingebautes ist und tun kann, was es will (in der Shell).

$ time ./hellostdoutstderr >stdout 2>stderr

real    0m0,511s
user    0m0,005s
sys 0m0,006s

um diese Ausgabe weiterhin umzuleiten, lesen Sie hier: https://stackoverflow.com/questions/18348593/how-can-i-output-from-usr-bin-time-to-a-file-at-the- Right-Location-Within-Exec

oder hier: https://www.cyberciti.biz/faq/unix-linux-time-command-examples-usage-syntax/

das System time druckt wie gewünscht auf stderr

$ \time ./hellostdoutstderr >stdout 2>stderr
$ cat stdout
stdout
$ cat stderr
stderr
0.00user 0.00system 0:00.50elapsed 1%CPU (0avgtext+0avgdata 3672maxresident)k
0inputs+16outputs (0major+311minor)pagefaults 0swaps

sie können time anweisen, in eine separate Datei zu drucken

$ \time -o timeout ./hellostdoutstderr >stdout 2>stderr
$ cat stderr
stderr
$ cat timeout 
0.00user 0.00system 0:00.50elapsed 1%CPU (0avgtext+0avgdata 3676maxresident)k
0inputs+16outputs (0major+309minor)pagefaults 0swaps
64
lesmana