Вивести час виконання команди оболонки


88

Чи можна надрукувати час виконання команди оболонки з наступною комбінацією?

root@hostname:~# "command to execute" && echo "execution time"

Відповіді:


72

Не забувайте, що є різниця між вбудованим bash time(який за замовчуванням повинен викликатися time command) і /usr/bin/time(що вимагатиме, щоб ви викликали його за повним шляхом).

Вбудований файл timeзавжди друкує в stderr, але /usr/bin/timeдозволить надсилати вихідні дані часу до певного файлу, щоб ви не заважали потоку stderr виконаної команди. Крім того, /usr/bin/timeформат 'можна налаштувати в командному рядку або змінною середовища TIME, тоді як вбудований timeформат bash налаштовується лишеTIMEFORMAT змінною середовища.

$ time factor 1234567889234567891 # builtin
1234567889234567891: 142662263 8653780357

real    0m3.194s
user    0m1.596s
sys 0m0.004s
$ /usr/bin/time factor 1234567889234567891
1234567889234567891: 142662263 8653780357
1.54user 0.00system 0:02.69elapsed 57%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+215minor)pagefaults 0swaps
$ /usr/bin/time -o timed factor 1234567889234567891 # log to file `timed`
1234567889234567891: 142662263 8653780357
$ cat timed
1.56user 0.02system 0:02.49elapsed 63%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+217minor)pagefaults 0swaps

From man bash: "Для змінної TIMEFORMAT може бути встановлений форматний рядок, який вказує, як повинна відображатися інформація про час"
Призупинено до подальшого повідомлення.

На жаль, я думав, що є якийсь спосіб відформатувати його, але я пропустив його, help timeбо лише переглянув його і думав, що це аргумент командного рядка. Я оновлю відповідь.
Марк Рушаков,

2
Ось ми через 9 років, і команда зайняла лише 0m0.018s. Я просто думав, що на це вкажу.
Ghassen Louhaichi

112

time - це вбудована команда в більшості оболонок, яка записує інформацію про час виконання в tty.

Ви також можете спробувати щось на зразок

start_time=`date +%s`
<command-to-execute>
end_time=`date +%s`
echo execution time was `expr $end_time - $start_time` s.

Або в bash:

start_time=`date +%s`
<command-to-execute> && echo run time is $(expr `date +%s` - $start_time) s

погодившись з Маазою, ця гнучкість дозволила мені виміряти час цілого набору команд.
Нат

Чи можна застосувати аспекти Linux навколо будь-якої команди linux для обчислення виконання
Syed Mazreena

1
Одним недоліком цього підходу є те, що він вимірює в секундах, тоді як timeвикористовує мілісекунди. І якщо ви хочете об'єднати кілька команд, не використовуючи змінні та обчислення, ви можете скористатися дужками: time ( command1 ; command2 ; command3 )ви можете навіть встановити час окремо разом із загальним часом, наприклад так: time ( time command1 ; time command2 ; time command3 ) Звичайно, якщо ви хочете двадцять команд, може краще використовувати рішення цієї відповіді. Але тоді вам слід почати думати про те, щоб ввести всі свої команди у сценарій ...
msb

25
root@hostname:~# time [command]

Він також розрізняє використовуваний реальний час та системний час.


Це, безумовно, основна відповідь - але є деякі ускладнення, якщо ви хочете побачити висновок про помилку від команди і все ж надіслати інформацію про час до стандартного виводу, як це робить питання. Команда time пише в stderr. Те, що ви пропонуєте, є, мабуть, досить точним - звідси мій +1.
Джонатан Леффлер

2
timeпише в tty, а не stderr. Що, на мою думку, погіршує ситуацію.
моб

12

Для поетапного вимірювання дельти спробуйте gnonom .

Це утиліта командного рядка, трохи подібна ts moreutils, щоб додати інформацію про мітки часу до стандартного виводу іншої команди. Корисно для тривалих процесів, де ви хочете отримати історичний запис того, що так довго триває.

Подаючи що-небудь до gnomon, буде додано позначку часу до кожного рядка, вказуючи, скільки часу цей рядок був останнім рядком у буфері - тобто скільки часу знадобився наступний рядок. За замовчуванням gnomon відображатиме секунди, що пройшли між кожним рядком, але це можна налаштувати.

демо-версія gnomon


8

Додавання до відповіді @ mob:

Додавання %Nдо date +%sдає нам наносекундну точність:

start=`date +%s%N`;<command>;end=`date +%s%N`;echo `expr $end - $start`

5

Якщо я починаю тривалий процес, такий як копія чи хеш, і я хочу пізніше знати, скільки часу це зайняло, я просто роблю це:

$ date; sha1sum reallybigfile.txt; date

Що призведе до такого результату:

Tue Jun  2 21:16:03 PDT 2015
5089a8e475cc41b2672982f690e5221469390bc0  reallybigfile.txt
Tue Jun  2 21:33:54 PDT 2015

Звичайно, як реалізовано тут, він не дуже точний і не обчислює витрачений час. Але це бруд простий і іноді все, що вам потрібно.


4

У zsh можна використовувати

=time ...

У bash або zsh ви можете використовувати

command time ...

Вони (за різними механізмами) змушують використовувати зовнішню команду.


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