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

5

Der Kommentar von @mpy war korrekt. Also formuliere ich meine Frage neu. Ich mag die REPORTTIME-Funktion in zsh sehr, aber sie gibt nur dann Zeit an, wenn die Benutzer- und Systemzeit laut $ REPORTTIME größer ist zsh doc . Gibt es eine Möglichkeit, zsh zu veranlassen, Zeit zu melden, wenn die Wandzeit größer als eine bestimmte Zahl ist, aber keine Zeit zu melden, wenn die Wandzeit unter dieser Zahl liegt?

Ursprüngliche Frage: Ich mag die REPORTTIME-Funktion in zsh wirklich, aber laut der zsh doc wird nur ausgegeben, wenn das Befehlsergebnis ungleich Null ist. Aber es gibt 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, selbst wenn das Ergebnis fehlschlägt?

ktsujister
quelle
2
IMHO der doc (" REPORTTIME Wenn nicht negativ, ... ") bezieht sich auf $REPORTTIME selbst, nicht den Rückgabestatus des Befehls. Beachten Sie, dass die Benutzer- + Systemzeit größer sein muss als $REPORTTIME, nicht die Wandzeit. So sleep 2 meldet selbst mit keine Statistik REPORTTIME=1
mpy
Danke für die Kommentare. Ich verstehe ... Mein Befehl hat mehr als 10 Minuten gedauert und ist fehlgeschlagen. Daher überprüfe ich mit dem Befehl time, was die Benutzer- und Systemzeit für den Fall ist, dass es nicht funktioniert hat.
ktsujister

Antworten:

9

Die Funktionalität von REPORTTIME scheint schwer zu vergleichen zu sein usertime+systime. Der relevante zsh Quellcode für das REPORTTIME Funktionalitä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 Ihren zshrc ändern, um eine Funktionalität zu erhalten, die der von ahnlich ist REPORTTIME Gesamtlaufzeit verwenden.

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 = ${stop} - ${cmd_start_time}"
  (( $elapsed > $REPORTTIME_TOTAL )) && print -P "%F{yellow}${elapsed}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. Die Ausführungszeit wird nicht in Benutzer- und Systemzeit unterteilt.


quelle