Как получить начальную и конечную отметки времени команды?


1

У меня есть инструмент, который выводит на стандартный вывод очень часто, без потери общности, скажем, что последовательность идет:

mysystem$ ./runme
Starting
Done
mysystem$

Теперь «runme» занимает некоторое время, поэтому мне бы очень хотелось, чтобы оболочка дала мне

mysystem$ somecommand ./runme
0952 Starting
1134 Done
mysystem$

Или какое-то приближение к этому ... есть идеи? Был бы счастлив с такими вещами, как запись в файл и так далее ...

РЕДАКТИРОВАТЬ люблю быстрый ответ до сих пор, но я должен был быть более ясным ...

Вполне возможно, что программа делает промежуточные заявления, поэтому я бы очень хотел, чтобы оболочка дала мне

mysystem$ somecommand ./runme
0952 Starting
0959 Somewaythough
1011 Mostly done
1134 Done
mysystem$

Но это вполне может быть невозможно ...


1
Вы задаете два совершенно разных вопроса. Ваше отредактированное сообщение требует, чтобы у вас действительно был вывод, в то время как первый мог обойтись без. Например, sleep 5не может быть рассчитано так, как вы хотите. Пожалуйста, уточните, что это.
Даниэль Бек

Ответы:


2

ток

$ ./slow
Starting ...
Nearly finished ...
All done.

Желаемый

$./slow | ./stamp
15:31:19 Starting ...
15:31:29 Nearly finished ...
15:31:31 All done.

Медленная прога

$ cat slow
#!/usr/bin/ksh
echo Starting ...
sleep 10
echo Nearly finished ...
sleep 2
echo All done.

TimeStamper

$ cat stamp
#!/usr/bin/perl
use strict;
use warnings;
while(<>) {
  my($sec, $min, $hour) = (localtime)[0..2];
  print "$hour:$min:$sec $_";
}

На самом деле, я удивлен, что это работает, я думал, что мне нужно что-то делать с буферизацией. YMMV

Использование sprintfдля форматирования времени оставлено читателю в качестве упражнения.


Для игроков в гольф

$ ./slow | perl -n -e 'printf "%02d:%02d:%02d %s", (localtime)[2,1,0],$_'
15:42:17 Starting ...
15:42:27 Nearly finished ...
15:42:29 All done.

2

Вы можете поставить timeперед командой для выполнения, и это будет время выполнения.

user@hostname/pwd$ time ls
file1
file2
file3

real      0m0.006s
user      0m0.001s
sys       0m0.003s

Более длинные команды делают для более интересных таймингов.


Сделайте это ответом @slhck - это лучше всего подходит для ОП
Пол

Разве Q не запрашивал «метки времени» с часами и минутами, в которые произошло событие?
RedGrittyBrick

0

Что о:

ls -la 
total 28
drwxr-xr-x   2 glens glens    27 2011-06-16 09:27 ./
drwxr-xr-x 197 glens glens 69632 2011-11-10 11:17 ../
-rwxrwxrwx   1 glens glens   406 2011-06-16 09:27 SERVER_LOG.txt*

и с sed

ls -la  | sed -e "s/\(.*\)/$(date +%H%M) \1/"
1154 total 28
1154 drwxr-xr-x   2 glens glens    27 2011-06-16 09:27 ./
1154 drwxr-xr-x 197 glens glens 69632 2011-11-10 11:17 ../
1154 -rwxrwxrwx   1 glens glens   406 2011-06-16 09:27 SERVER_LOG.txt*

0

В bash, вы можете комбинировать DEBUGловушку и PROMPT_COMMANDвыводить время непосредственно до и после выполнения команды.

trap 'echo $( date )' DEBUG
PROMPT_COMMAND='echo $( date )'

Вот как это выглядит (повторяется второй вывод, как PROMPT_COMMANDкоманда trappable:

$ sleep 5
Do 10 Nov 2011 18:10:36 CET
Do 10 Nov 2011 18:10:41 CET
Do 10 Nov 2011 18:10:41 CET

Я видел, что пользователю также нужны времена промежуточных операторов, но в любом случае это может быть полезно для кого-то.
Даниэль Бек
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.