Есть ли команда типа time
, которая может отображать детали времени выполнения последних или прошлых запущенных команд в оболочке?
Есть ли способ найти время выполнения последней выполненной команды в оболочке?
Ответ 1
Я не знаю, как это делается в bash, но в zsh вы можете определить функции preexec
и precmd
, чтобы они сохраняли текущее время для переменных $STARTTIME
(preexec) и $ENDTIME
( precmd), чтобы вы могли найти приблизительное время работы. Или вы можете определить функцию accept-line
, чтобы она до начала time
перед каждой командой.
UPDATE:
Это код, который будет хранить истекшее время в массиве $_elapsed
:
preexec () {
(( $#_elapsed > 1000 )) && set -A _elapsed $_elapsed[-1000,-1]
typeset -ig _start=SECONDS
}
precmd() { set -A _elapsed $_elapsed $(( SECONDS-_start )) }
Затем, если вы запустите sleep 10s
:
% set -A _elapsed # Clear the times
% sleep 10s
% sleep 2s ; echo $_elapsed[-1]
10
% echo $_elapsed
0 10 0
Нет необходимости в четырех переменных. Нет проблем с именами или дополнительными задержками. Просто обратите внимание, что массив $_elapsed
может расти очень большой, поэтому вам нужно удалить первые элементы (это делается с помощью следующего фрагмента кода: (( $#_elapsed > 1000 )) && set -A _elapsed $_elapsed[-1000,-1]
).
UPDATE2:
Найден script для поддержки zm-стиля premd и preexec в bash. Возможно, вам нужно будет удалить typeset -ig
(я использовал просто, чтобы $_start
был целым числом) и заменил set -A var ...
на var=( ... )
, чтобы заставить это работать. И я не знаю, как разрезать массивы и получить их длину в bash.
Script: http://www.twistedmatrix.com/users/glyph/preexec.bash.txt
Update3:
Найдена одна проблема: если вы нажмете return с пустой строкой, preexec не запустится, а precmd сделает, поэтому вы получите бессмысленные значения в массиве $_elapsed
. Чтобы исправить это, замените функцию precmd
на следующий код:
precmd () {
(( _start >= 0 )) && set -A _elapsed $_elapsed $(( SECONDS-_start ))
_start=-1
}
Ответ 2
Изменить 3:
Структура этого ответа:
- Нет готового способа выполнить команду, которая уже была запущена
- Существуют способы, которыми вы можете определить срок действия времени выполнения команды.
- Доказательство концепции показано (начиная с гипотезы, что это невозможно сделать и заканчивая тем, что гипотеза была неправильной).
- Есть взломы, которые вы можете ввести перед собой, чтобы записать прошедшее время каждой команды, которую вы запускаете.
- Заключение
Ответ, обозначенный его частями в соответствии с вышеприведенным планом:
Часть 1 - короткий ответ "нет"
Оригинал
Нет, извините. Вы должны использовать time
.
Часть 2 - возможно, вы можете вывести результат
В некоторых случаях, если программа записывает выходные файлы или информацию в файлы журналов, вы могли бы определить время выполнения, но это было бы специфично для программы и было бы только guesstimate. Если у вас установлен HISTTIMEFORMAT в Bash, вы можете посмотреть записи в файле истории, чтобы получить представление о запуске программы. Но время окончания не регистрируется, поэтому вы можете вывести только продолжительность, если другая программа была запущена сразу после того, как вы заинтересованы в завершении.
Часть 3 - гипотеза фальсифицирована
Гипотеза: время простоя будет засчитываться за истекшее время
Edit:
Вот пример, иллюстрирующий мою мысль. Он основан на предположении ZyX, но будет аналогичным с использованием других методов.
В zsh
:
% precmd() { prevstart=start; start=$SECONDS; }
% preexec() { prevend=$end; end=$SECONDS; }
% echo "T: $SECONDS ps: $prevstart pe: $prevend s: $start e: $end"
T: 1491 ps: 1456 pe: 1458 s: 1459 e: 1491
Теперь мы подождем... допустим в течение 15 секунд, затем:
% echo "T: $SECONDS"; sleep 10
T: 1506
Теперь мы подождем... пусть говорят в течение 20 секунд, а затем:
% echo "T: $SECONDS ps: $prevstart pe: $prevend s: $start e: $end"
T: 1536 ps: 1492 pe: 1506 s: 1516 e: 1536
Как вы можете видеть, я был неправильным. Время начала (1516) минус предыдущее время окончания (1506) равно длительности команды (sleep 10
). Что также показывает, что переменные, которые я использовал в функциях, нуждаются в более лучших именах.
Гипотеза фальсифицирована - она позволяет получить правильное истекшее время без включения времени простоя
Часть 4 - взлом для записи прошедшего времени каждой команды
Изменить 2:
Вот эквиваленты Bash для функций в ответе ZyX (им нужен связанный с ним script):
preexec () {
(( ${#_elapsed[@]} > 1000 )) && _elapsed=(${_elapsed[@]: -1000})
_start=$SECONDS
}
precmd () {
(( _start >= 0 )) && _elapsed+=($(( SECONDS-_start )))
_start=-1
}
После установки preexec.bash
(из связанного script) и создания двух функций выше, пример будет выглядеть следующим образом:
$ _elapsed=() # Clear the times
$ sleep 10s
$ sleep 2s ; echo ${_elapsed[@]: -1}
10
$ echo ${_elapsed[@]}
0 10 2
Часть 5 - заключение
Используйте time
.
Ответ 3
Я так понимаю, вы выполняете команды, которые занимают много времени и не понимают вначале, что вы хотели бы, сколько времени потребуется для завершения. В zsh, если вы установите переменную среды REPORTTIME в число, любая команда, занимающая дольше, чем это количество секунд, будет иметь время, когда оно было напечатано, как будто вы запустили его с помощью команды времени перед ней. Вы можете установить его в своем .zshrc, чтобы длинные команды всегда печатали свое время. Обратите внимание, что время, затрачиваемое на спящий режим (в отличие от времени пользователя/системы), не учитывается для запуска таймера, но по-прежнему отслеживается.
Ответ 4
Мир, возможно, немного изменился, так как другие люди ответили на эти вопросы.
zsh
имеет некоторые встроенные функции во времени, как долго выполняются команды.
Если вы включите опцию inc_append_history_time с
setopt inc_append_history_time
Затем время, затрачиваемое на выполнение каждой команды, сохраняется в вашей истории, а затем можно просмотреть с помощью history -D
.
Ответ 5
Я думаю, вы можете получить статистику времени только для команд, которые вы запускаете, используя команду "время".
На странице man:
время [опции] команда [arguments...]
ОПИСАНИЕ Команда time запускает указанную команду программы с данными аргументами. Когда команда заканчивается, время записывает сообщение в стандартную ошибку, дающую статистику времени об этой программе.