Чи є спосіб роздрукувати час виконання (час стіни) в zsh, коли він перевищує певний налаштований поріг?


5

Коментар @mpy був правильним. Тому я перефразую своє запитання. Мені дуже подобається функція REPORTTIME в zsh, але вона повідомляє лише час, коли користувацький + системний час перевищує $ REPORTTIME згідно zsh doc . Чи є спосіб зробити час звіту zsh, коли час стіни перевищує деяку кількість, але не повідомити час, коли час стіни нижче цього числа?

Оригінальне запитання: Мені дуже подобається функція REPORTTIME в zsh, але відповідно до zsh doc , вона видаватиметься лише тоді, коли результат команди ненульовий. Але бувають випадки, коли якась команда займає деякий час і не вдається, і я хочу знати, скільки часу пройшло. Хтось знає спосіб роздрукувати час для команди, навіть якщо результат не вдався?


2
IMHO doc (" REPORTTIMEЯкщо неотрицательно, ...") посилається на $REPORTTIMEсебе, а не на стан повернення команди. Зауважте, що системний час user + повинен бути більшим, ніж $REPORTTIMEчас стіни. Тому sleep 2не повідомляйте про статистику навіть зREPORTTIME=1
mpy

Дякуємо за коментарі. Я бачу ... Моя команда зайняла 10 хвилин і не вдалася, тому я перевіряю за допомогою команди time, щоб побачити, який час у користувача + системний час у випадку, який не працює.
ktsujister

Відповіді:


9

Функціональність, REPORTTIMEсхоже, важко кодована для порівняння usertime+systime. Відповідний вихідний код zsh для REPORTTIMEфункціональності:

#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

Як альтернативне рішення, ви можете змінити свій zshrc, щоб отримати функціональність, подібний до REPORTTIMEвикористання загального часу роботи.

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
}

На жаль, ця команда дає лише загальний час виконання. Він не розбиває час виконання на час користувача та системи.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.