it-swarm.com.de

Wie kann ich die Ausgabe des Zeitbefehls in eine Datei in Linux umleiten?

Nur eine kleine Frage zum Timing von Programmen unter Linux: Mit dem Befehl time kann die Ausführungszeit eines Programms gemessen werden.

[[email protected] ~]$ time sleep 1

real    0m1.004s
user    0m0.000s
sys     0m0.004s

Was gut funktioniert. Wenn ich jedoch versuche, die Ausgabe in eine Datei umzuleiten, schlägt dies fehl.

[[email protected] ~]$ time sleep 1 > time.txt

real    0m1.004s
user    0m0.001s
sys     0m0.004s

[[email protected] ~]$ cat time.txt 
[[email protected] ~]$ 

Ich weiß, es gibt andere Implementierungen der Zeit mit der Option -o, um eine Datei zu schreiben. Meine Frage betrifft den Befehl ohne diese Optionen.

Irgendwelche Vorschläge ?

166
ed82

Versuchen

{ time sleep 1 ; } 2> time.txt

welches die STDERR von "time" und Ihren Befehl in time.txt kombiniert

Oder verwenden

{ time sleep 1 2> sleep.stderr ; } 2> time.txt

was STDERR von "sleep" in die Datei "sleep.stderr" setzt und nur STDERR von "time" in "time.txt"

217
January

Umfassen Sie time und den Befehl, den Sie in einer Reihe von Klammern setzen.

Die folgenden Zeiten ls und schreibt das Ergebnis von ls und die Ergebnisse des Timings in outfile:

$ (time ls) > outfile 2>&1

Oder, wenn Sie die Ausgabe des Befehls von der erfassten Ausgabe von time trennen möchten:

$ (time ls) > ls_results 2> time_results
34
sampson-chen

Einfach. Das Dienstprogramm GNU time verfügt über eine Option.

Sie müssen jedoch sicherstellen, dass Sie nicht mit dem eingebauten time-Befehl Ihrer Shell arbeiten. Zumindest das bash-buildin bietet diese Option nicht! Deshalb müssen Sie den vollständigen Pfad des Dienstprogramms time angeben:

/usr/bin/time -o time.txt sleep 1
27
cmaster

Wenn Sie sich um die Fehlerausgabe des Befehls kümmern, können Sie diese so trennen, während Sie den integrierten Zeitbefehl verwenden.

{ time your_command 2> command.err ; } 2> time.log

oder

{ time your_command 2>1 ; } 2> time.log

Wie Sie sehen, gehen die Fehler des Befehls in eine Datei (da stderr für time verwendet wird).

Leider können Sie es nicht an ein anderes Handle (wie 3>&2) senden, da es außerhalb des {...} nicht mehr existiert.

Das heißt, wenn Sie GNU Zeit verwenden können, tun Sie einfach, was @ Tim Ludwinski gesagt hat.

\time -o time.log command
12
Mark

Da die Ausgabe des Befehls 'time' eine Fehlerausgabe ist, wäre eine Umleitung als Standardausgabe für die weitere Verarbeitung intuitiver.

{ time sleep 1; } 2>&1 |  cat > time.txt
6
jaycee xu

Wenn Sie GNU anstelle der integrierten Bash-Zeit verwenden, versuchen Sie es

time -o outfile command

(Hinweis: GNU Zeitformate etwas anders als die integrierte Bash). 

5
Tim Ludwinski
&>out time command >/dev/null

in Ihrem Fall

&>out time sleep 1 >/dev/null

dann

cat out
2
alinsoar

Ich endete mit:

/usr/bin/time -ao output_file.txt -f "Operation took: %E" echo lol
  • Wo "a" angehängt wird
  • Wo "o" mit dem Dateinamen fortgesetzt wird, an den angehängt werden soll
  • Dabei ist "f" ein Format mit einer printf-artigen Syntax
  • Wo "% E" 0:00:00 erzeugt; Stunden: Minuten: Sekunden
  • Ich musste/usr/bin/time aufrufen, da die bash "time" sie trampelte und nicht dieselben Optionen hat
  • Ich habe nur versucht, die Ausgabe in eine Datei zu bekommen, nicht dasselbe wie OP
2
Locane
#!/bin/bash

set -e

_onexit() {
    [[ $TMPD ]] && rm -rf "$TMPD"
}

TMPD="$(mktemp -d)"
trap _onexit EXIT

_time_2() {
    "[email protected]" 2>&3
}

_time_1() {
    time _time_2 "[email protected]"
}

_time() {
    declare time_label="$1"
    shift
    exec 3>&2
    _time_1 "[email protected]" 2>"$TMPD/timing.$time_label"
    echo "time[$time_label]"
    cat "$TMPD/timing.$time_label"
}

_time a _do_something
_time b _do_another_thing
_time c _finish_up

Dies hat den Vorteil, dass keine Sub-Shells gestartet werden, und für die letzte Pipeline wird der Stderr auf den echten Stderr zurückgesetzt. 

1
Adam Heath

Wenn Sie csh verwenden, können Sie Folgendes verwenden:

/usr/bin/time --output=outfile -p $Shell  -c 'your command'

Zum Beispiel:

/usr/bin/time --output=outtime.txt -p csh -c 'cat file'
0
Leo Cardona

Wenn Sie den ursprünglichen Prozess 'stdout und stderr' nicht berühren möchten, können Sie stderr zum Dateideskriptor 3 und zurück umleiten:

$ { time { Perl -le "print 'foo'; warn 'bar';" 2>&3; }; } 3>&2 2> time.out
foo
bar at -e line 1.
$ cat time.out

real    0m0.009s
user    0m0.004s
sys     0m0.000s

Sie können dies für einen Wrapper (z. B. für Cronjobs) verwenden, um die Laufzeit zu überwachen:

#!/bin/bash

echo "[$(date)]" "[email protected]" >> /my/runtime.log

{ time { "[email protected]" 2>&3; }; } 3>&2 2>> /my/runtime.log
0
Tobias Gödderz