Linux에서 time 명령의 출력을 파일로 리디렉션하는 방법은 무엇입니까?


202

Linux에서 프로그램 타이밍에 관한 약간의 질문 : time 명령을 사용하면 프로그램의 실행 시간을 측정 할 수 있습니다.

[ed@lbox200 ~]$ time sleep 1

real    0m1.004s
user    0m0.000s
sys     0m0.004s

어느 것이 잘 작동합니까? 그러나 출력을 파일로 리디렉션하려고하면 실패합니다.

[ed@lbox200 ~]$ time sleep 1 > time.txt

real    0m1.004s
user    0m0.001s
sys     0m0.004s

[ed@lbox200 ~]$ cat time.txt 
[ed@lbox200 ~]$ 

파일을 작성하는 옵션 -o를 사용하여 다른 시간 구현이 있다는 것을 알고 있지만 내 질문은 해당 옵션이없는 명령에 관한 것입니다.

어떤 제안?


3
bash 스크립트 쓰기 실행 시간이 파일에서 중복 될 수 있으며 이것이 첫 번째 질문이라는 것을 확신하지 못합니다.
— Jonathan Leffler

답변:


266

시험

{ time sleep 1 ; } 2> time.txt

"시간"의 STDERR과 명령을 time.txt로 결합한

또는 사용

{ time sleep 1 2> sleep.stderr ; } 2> time.txt

"sleep"의 STDERR을 "sleep.stderr"파일에 넣고 "time"의 STDERR 만 "time.txt"로갑니다.


2
고마워, 내 질문에 정확하게 답해. 올바르게 이해하면 시간 명령의 결과를 stderr에서 얻을 수 있습니까?
— ed82

7
예, 그러나 중괄호로 묶어야합니다. 그렇지 않으면 리디렉션이 time평가 되는 명령의 일부가 됩니다.
— 월

5
@Daniel 당신은 항상 내부 명령 출력을 따로 따로 리다이렉션 할 수 있고 (즉, {time sleep 1 2> sleepStdErr.txt;} 2> time.txt) 시간 출력 만 얻을 수 있습니다. 그렇지 않으면 독립적으로 얻을 수있는 방법이 있는지 확실하지 않습니다.
— gms7777

10
stdout을 읽는 grep과 같은 시간을 사용하려면 시도하십시오 { time sleep 1; } 2>&1 | grep real. 그러면 stderr을 stdout으로 보내어 grep을 읽을 수 있습니다.
— clayzermk1

9
';'을 잊지 마십시오 '}'닫기 전에 문자, 그것은 것입니다 (내가 한, 그리고 ... 궁금 왜 작동하지 않습니다 :))없이 NOT 일
— THESorcerer

38

랩 time과 타이밍 명령은 대괄호로 묶습니다.

예를 들어, 다음은 시간 ls결과 ls와 타이밍 결과를 다음에 기록합니다 outfile.

$ (time ls) > outfile 2>&1

또는 명령의 출력을 캡처 된 출력과 time다음 에서 분리하려는 경우 :

$ (time ls) > ls_results 2> time_results

12
여기에 서브 쉘을 소개 할 필요는 없습니다.
— 월

1
@ sampson-chen ls가 stderr에 아무것도 쓰지 않기 때문에 작동합니까? 명령이 stdout과 stderr에 모두 쓰는 경우 실행할 'time'의 출력을 명령의 출력과 어떻게 "분리"합니까?
— David Doria

36

단순한. GNU time유틸리티에는 옵션이 있습니다.

그러나 당신은 당신이 있는지 확인해야 하지 쉘의 내장을 사용하여 time, 명령을 적어도 bash내장 해당 옵션을 제공하지 않습니다! 따라서 time유틸리티 의 전체 경로를 제공해야 합니다.

/usr/bin/time -o time.txt sleep 1

: 당신은 또한 전체 경로를 지정하지 않고 비 내장을 사용할 수 있습니다 stackoverflow.com/questions/29540540/...
— 치로 틸리郝海东冠状病六四事件法轮功

14

명령의 오류 출력에 신경 쓰면 내장 시간 명령을 계속 사용하면서 이와 같이 분리 할 수 ​​있습니다.

{ 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

8

'time'명령의 출력은 오류 출력이므로 표준 처리가 더 직관적으로 처리되므로 추가 처리를 수행하도록 리디렉션하십시오.

{ time sleep 1; } 2>&1 |  cat > time.txt

6

bash 내장 대신 GNU 시간을 사용하는 경우

time -o outfile command

(참고 : GNU 시간 형식은 bash 내장과 약간 다릅니다.)


1
감사합니다 그리고 \time -o outfile command내장 된 대신 GNU를 사용 하기 위해 (``와 함께) 사용할 수 있습니다 .
— Mark

3
&>out time command >/dev/null

당신의 경우에

&>out time sleep 1 >/dev/null

그때

cat out

3
우아한 아이디어이지만 쉘이 내장 명령을 사용하지 않습니다. 실제 time바이너리가 설치되어 있지 않으면 out다음과 같은 내용이 포함됩니다 bash: time: command not found.
— scy

또한 GNU 시간의 형식은 bash 내장과 동일하지 않으므로 자동 구문 분석에 문제가 발생합니다.
— Guss

3

나는 다음을 사용하여 끝났다.

/usr/bin/time -ao output_file.txt -f "Operation took: %E" echo lol
  • "a"가 추가 된 곳
  • 추가 할 파일 이름으로 "o"가 진행되는 위치
  • 여기서 "f"는 printf와 같은 구문으로 형식화됩니다.
  • "% E"는 0:00:00을 생성합니다. 시간 : 분 : 초
  • bash "time"이 그것을 짓밟고 있고 동일한 옵션이 없기 때문에 / usr / bin / time을 호출해야했습니다.
  • 방금 OP와 같은 것이 아니라 파일로 출력하려고했습니다.

2
#!/bin/bash

set -e

_onexit() {
    [[ $TMPD ]] && rm -rf "$TMPD"
}

TMPD="$(mktemp -d)"
trap _onexit EXIT

_time_2() {
    "$@" 2>&3
}

_time_1() {
    time _time_2 "$@"
}

_time() {
    declare time_label="$1"
    shift
    exec 3>&2
    _time_1 "$@" 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이 복원되었습니다.


0

원래 프로세스의 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

랩퍼 (예 : cronjobs)에이를 사용하여 런타임을 모니터 할 수 있습니다.

#!/bin/bash

echo "[$(date)]" "$@" >> /my/runtime.log

{ time { "$@" 2>&3; }; } 3>&2 2>> /my/runtime.log

0

사용중인 경우 다음을 사용할 csh수 있습니다.

/usr/bin/time --output=outfile -p $SHELL  -c 'your command'

예를 들면 다음과 같습니다.

/usr/bin/time --output=outtime.txt -p csh -c 'cat file'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.