Как перенаправить вывод команды времени в файл в Linux?
Просто вопрос о программах синхронизации в Linux: команда времени позволяет
измерьте время выполнения программы:
[[email protected] ~]$ time sleep 1
real 0m1.004s
user 0m0.000s
sys 0m0.004s
Что отлично работает. Но если я попытаюсь перенаправить вывод в файл, он терпит неудачу.
[[email protected] ~]$ time sleep 1 > time.txt
real 0m1.004s
user 0m0.001s
sys 0m0.004s
[[email protected] ~]$ cat time.txt
[[email protected] ~]$
Я знаю, что есть другие реализации времени с опцией -o для записи файла, но
мой вопрос касается команды без этих параметров.
Любые предложения?
Ответы
Ответ 1
Try
{ time sleep 1 ; } 2> time.txt
который объединяет STDERR "времени" и вашей команды в time.txt
Или используйте
{ time sleep 1 2> sleep.stderr ; } 2> time.txt
который ставит STDERR из "sleep" в файл "sleep.stderr", и только STDERR от "time" переходит в "time.txt"
Ответ 2
Оберните time
и команду, в которой вы указываете время в наборе скобок.
Например, следующие времена ls
и записывает результат ls
и результаты синхронизации в outfile
:
$ (time ls) > outfile 2>&1
Или, если вы хотите отделить вывод команды от захваченного вывода с time
:
$ (time ls) > ls_results 2> time_results
Ответ 3
Simple. Утилита GNU time
имеет возможность для этого.
Но вы должны убедиться, что вы не используете команду shell builtin time
, по крайней мере, встроенный bash
не предоставляет эту опцию! Для этого вам необходимо указать полный путь к утилите time
:
/usr/bin/time -o time.txt sleep 1
Ответ 4
Если вы заботитесь о выходе ошибки команды, вы можете их разделить так, используя при этом встроенную команду времени.
{ time your_command 2> command.err ; } 2> time.log
или
{ time your_command 2>1 ; } 2> time.log
Как вы видите, ошибки команды идут в файл (поскольку stderr
используется для time
).
К сожалению, вы не можете отправить его другому дескриптору (например, 3>&2
), поскольку он больше не будет существовать вне {...}
Тем не менее, если вы можете использовать время GNU, просто сделайте то, что сказал @Tim Ludwinski.
\time -o time.log command
Ответ 5
Если вы используете время GNU вместо встроенного bash, попробуйте
time -o outfile command
(Примечание. Формат времени GNU немного отличается от встроенного bash).
Ответ 6
Поскольку вывод команды "время" является выходом ошибки, перенаправление его как стандартного вывода было бы более интуитивно понятным для дальнейшей обработки.
{ time sleep 1; } 2>&1 | cat > time.txt
Ответ 7
&>out time command >/dev/null
в вашем случае
&>out time sleep 1 >/dev/null
затем
cat out
Ответ 8
#!/bin/bash
set -e
_onexit() {
[[ $TMPD ]] && rm -rf "$TMPD"
}
TMPD="$(mktemp -d)"
trap _onexit EXIT
_time_2() {
"[email protected]" 2>&3
}
_time_1() {
time _time_2 "[email protected]"
}
_time() {
declare time_label="$1"
shift
exec 3>&2
_time_1 "[email protected]" 2>"$TMPD/timing.$time_label"
echo "time[$time_label]"
cat "$TMPD/timing.$time_label"
}
_time a _do_something
_time b _do_another_thing
_time c _finish_up
Это имеет смысл не создавать нерегулярные оболочки, а в последнем конвейере stderr восстанавливается до реального stderr.
Ответ 9
Я закончил тем, что использовал:
/usr/bin/time -ao output_file.txt -f "Operation took: %E" echo lol
- Где "a" добавляется
- Где "o" выполняется по имени файла для добавления к
- Где "f" - формат с синтаксисом типа printf
- Где "% E" производит 0:00:00; часы: минуты: секунды
- Мне пришлось вызывать /usr/bin/time, потому что bash "time" трассировал его и не имеет одинаковых параметров
- Я просто пытался получить вывод в файл, а не то же самое, что и OP
Ответ 10
Если вы не хотите прикасаться к исходному процессу 'stdout и stderr, вы можете перенаправить stderr на дескриптор файла 3 и обратно:
$ { time { perl -le "print 'foo'; warn 'bar';" 2>&3; }; } 3>&2 2> time.out
foo
bar at -e line 1.
$ cat time.out
real 0m0.009s
user 0m0.004s
sys 0m0.000s
Вы можете использовать это для обертки (например, для cronjob) для мониторинга времени выполнения:
#!/bin/bash
echo "[$(date)]" "[email protected]" >> /my/runtime.log
{ time { "[email protected]" 2>&3; }; } 3>&2 2>> /my/runtime.log
Ответ 11
Если вы используете csh
вы можете использовать:
/usr/bin/time --output=outfile -p $SHELL -c 'your command'
Например:
/usr/bin/time --output=outtime.txt -p csh -c 'cat file'