Gibt es eine Möglichkeit, die Ausführungszeit (Wandzeit) in zsh auszudrucken, wenn diese einen bestimmten konfigurierbaren Schwellenwert überschreitet?

1153
ktsujister

@mpys Kommentar war korrekt. Also formuliere ich meine Frage neu. Ich mag die Funktion REPORTTIME in zsh wirklich, aber sie meldet nur die Zeit, zu der die Benutzer- und Systemzeit laut zsh doc größer als $ REPORTTIME ist . Gibt es eine Möglichkeit, zsh-Berichtszeit zu erstellen, wenn die Wandzeit größer als eine bestimmte Anzahl ist, aber keine Berichtszeit, wenn die Wandzeit unter dieser Nummer liegt?

Ursprüngliche Frage: Ich mag die Funktion REPORTTIME in zsh wirklich, aber laut zsh-Dokument wird sie nur ausgegeben, wenn das Befehlsergebnis ungleich Null ist. Es gibt jedoch Fälle, in denen ein Befehl eine Weile dauert und fehlschlägt, und ich möchte wissen, wie lange es gedauert hat. Kennt jemand eine Möglichkeit, die Zeit für den Befehl auszudrucken, auch wenn das Ergebnis fehlgeschlagen ist?

5
IMHO the doc ("`REPORTTIME` If nonnegative,...") refers to `$REPORTTIME` itself, not the return status of the command. Note, that the user+system time must be greater than `$REPORTTIME`, not the wall time. So `sleep 2` doesn't report a statistics even with `REPORTTIME=1` mpy vor 10 Jahren 2
Danke für die Kommentare. Ich verstehe ... Mein Befehl hat mehr als 10 Minuten gedauert und ist fehlgeschlagen, also werde ich mit dem Zeitbefehl prüfen, welche Benutzer- und Systemzeit in dem Fall war, in dem es nicht funktioniert hat. ktsujister vor 10 Jahren 0

1 Antwort auf die Frage

9

Die Funktionalität von REPORTTIMEscheint zum Vergleich hart codiert zu sein usertime+systime. Der relevante zsh-Quellcode für die REPORTTIMEFunktionalität:

#ifdef HAVE_GETRUSAGE reporttime -= j->procs->ti.ru_utime.tv_sec + j->procs->ti.ru_stime.tv_sec; if (j->procs->ti.ru_utime.tv_usec + j->procs->ti.ru_stime.tv_usec >= 1000000) reporttime--; return reporttime <= 0; #else { clktck = get_clktck(); return ((j->procs->ti.ut + j->procs->ti.st) / clktck >= reporttime); } #endif 

Als alternative Lösung können Sie Ihre zshrc so ändern, dass REPORTTIMEdie Gesamtbetriebszeit verwendet wird.

REPORTTIME_TOTAL=5  # Displays the execution time of the last command if set threshold was exceeded cmd_execution_time() { local stop=$((`date "+%s + %N / 1_000_000_000.0"`)) let local "elapsed = $ - $" (( $elapsed > $REPORTTIME_TOTAL )) && print -P "%F$s%f" }  # Get the start time of the command preexec() { cmd_start_time=$((`date "+%s + %N / 1.0e9"`)) }  # Output total execution precmd() { if (($+cmd_start_time)); then cmd_execution_time fi } 

Leider gibt dieser Befehl nur die Gesamtlaufzeit an. Es teilt die Ausführungszeit nicht in Benutzer- und Systemzeit auf.