продолжительность, время начала и время окончания команды после ее завершения

Проверьте этот комментарий для возможного ответа.

Я видел ту же ошибку с Z400 от HPE (compaq ). Это сообщение об ошибке, вероятно, связано с тем, что диск выглядит как раздел, отформатированный *nix, но он не загружается из-за какой-то проблемы с содержимым диска. Когда возникает эта проблема, BIOS выдает это двусмысленное предупреждение.

5
03.01.2021, 08:45
1 ответ

Сzsh:

zmodload zsh/datetime
TIMEFMT='Total duration for %J: %*E'
preexec() strftime 'Start Time: %d/%m/%y %I:%M%P'
precmd() strftime 'End Time: %d/%m/%y %I:%M%P'
REPORTTIME=0

Затем вы получите время начала, напечатанное при вводе командной строки, время окончания, напечатанное непосредственно перед отображением следующего приглашения, и продолжительность каждой не -встроенной команды (, точнее, для каждой процесс, ожидаемый оболочкой):

$ sleep 1; sleep 2
Start Time: 02/01/21 08:31am
Total duration for sleep 1: 1.002
Total duration for sleep 2: 2.003
End Time: 02/01/21 08:31am

Вы можете изменить REPORTTIME=0на REPORTTIME=10, например, чтобы сообщать только время команд, которые занимают более 10 секунд процессорного времени (, а не истекшее время ), или префикс каждого команду, которую вы хотите синхронизировать с time.

Как скрипт, который запускает произвольную команду:

#! /bin/zsh -
zmodload zsh/datetime
TIMEFMT='Total duration: %*E'
strftime -s start 'Start Time: %d/%m/%y %I:%M%P'
{
  duration=$(
    exec 4>&2 2>&1 1>&3 3>&-
    time "$@" 2>&4 4>&-
  )
} 3>&1
ret=$?

strftime -s end 'End Time: %d/%m/%y %I:%M%P'
print -rlu2 $start $end $duration
exit $ret

А потом:

$./reporttime sleep 65
Start Time: 02/01/21 09:26am
End Time: 02/01/21 09:26am
Total duration: 1:05.00

Вместо того, чтобы полагаться на time,вы также можете использовать специальные переменные $SECONDSили $EPOCHSECONDS(или $EPOCHREALTIME/ $epochtime, если вам нужна гранулярность в доли секунды)

#! /bin/zsh -
zmodload zsh/datetime
start=($epochtime)
"$@"
end=($epochtime) ret=$?
strftime >&2 'Start Time: %FT%T.%3.%z' $start
strftime >&2 'End Time: %FT%T.%3.%z' $end
printf >&2 'Total duration: %.3f\n' $((
  end[1] - start[1] + (end[2] - start[2]) / 1e9
))
exit $ret

На этот раз используется стандартный и не -неоднозначный формат времени:

$./reporttime2 sleep 1
Start Time: 2021-01-02T09:50:49.261+0000
End Time: 2021-01-02T09:50:50.264+0000
Total duration: 1.003

Если вы все еще хотите сообщить об этом времени, когда вы нажимаете Ctrl + C или Ctrl + \ , что в противном случае убило бы оба zshи время команды, вы можете добавить:

trap true INT QUIT

в верхней части этих скриптов, чтобы оболочка перехватывала эти сигналы и не умирала там. Не выполняйте trap '' INT QUIT, иначе сигналы будут полностью проигнорированы, и в этом случае синхронизированная команда не будет уничтожена.

6
18.03.2021, 22:39

Теги

Похожие вопросы