Linux에서 시간 명령의 출력을 파일로 리디렉션하는 방법은 무엇입니까?
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 옵션을 사용하여 파일을 작성할 수 있는 다른 시간 구현이 있다는 것을 알고 있지만, 제 질문은 이러한 옵션이 없는 명령에 대한 것입니다.
좋은 의견이라도 있나?
해라
{ time sleep 1 ; } 2> time.txt
시간의 STDERR과 명령을 시간에 결합하는 것입니다.txt
또는 사용
{ time sleep 1 2> sleep.stderr ; } 2> time.txt
이는 STDERR을 "sleep.stderr" 파일에 넣고 "time"의 STDERR만 "time.txt"에 들어갑니다.
단순합니다. GNUtime
유틸리티는 그것에 대한 옵션을 가지고 있습니다.
하지만 셸에 내장된 기능을 사용하지 않는지 확인해야 합니다.time
명령, 적어도.bash
기본 제공 옵션은 제공되지 않습니다!그렇기 때문에 당신은 전체 경로를 제공해야 합니다.time
유틸리티:
/usr/bin/time -o time.txt sleep 1
싼다time
괄호 집합에서 타이밍을 지정하는 명령을 입력합니다.
예를 들어, 다음과 같은 시간이 있습니다.ls
의 결과를 작성합니다.ls
그리고 그 시기의 결과들.outfile
:
$ (time ls) > outfile 2>&1
또는 명령의 출력과 캡처된 출력을 분리하려는 경우time
:
$ (time ls) > ls_results 2> time_results
명령의 오류 출력이 신경 쓰이는 경우 내장 시간 명령을 사용하면서 이와 같이 오류 출력을 분리할 수 있습니다.
{ 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
'시간' 명령의 출력은 오류 출력이므로 표준 출력으로 리디렉션하는 것이 더 직관적으로 처리할 수 있습니다.
{ time sleep 1; } 2>&1 | cat > time.txt
bash 내장형 대신 GNU 시간을 사용하는 경우 시도해 보십시오.
time -o outfile command
(참고: GNU 시간 형식은 bash 기본 제공 형식과 약간 다릅니다.)
&>out time command >/dev/null
당신의 경우에는
&>out time sleep 1 >/dev/null
그리고나서
cat out
다음을 사용하게 되었습니다.
/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와 같은 것은 아닙니다.
원본 프로세스의 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
이를 래퍼(예: cron 작업)에 사용하여 런타임을 모니터링할 수 있습니다.
#!/bin/bash
echo "[$(date)]" "$@" >> /my/runtime.log
{ time { "$@" 2>&3; }; } 3>&2 2>> /my/runtime.log
#!/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로 복원합니다.
사중인경우를 .csh
사용할 수 있는 항목:
/usr/bin/time --output=outfile -p $SHELL -c 'your command'
예:
/usr/bin/time --output=outtime.txt -p csh -c 'cat file'
셸 변수의 시간만 사용하려면 다음 작업이 수행됩니다.
var=`{ time <command> ; } 2>&1 1>/dev/null`
언급URL : https://stackoverflow.com/questions/13356628/how-to-redirect-the-output-of-the-time-command-to-a-file-in-linux
'itsource' 카테고리의 다른 글
로보몽고를 사용하여 MongoDB Atlas에 연결하려면 어떻게 해야 합니까? (0) | 2023.05.02 |
---|---|
Git 저장소의 하위 디렉터리에 대한 Git 로그 기록(즉, 모든 관련 커밋)을 표시하는 방법 (0) | 2023.05.02 |
모든 하위 디렉터리에서 특정 확장명의 모든 파일 복사 (0) | 2023.05.02 |
Bash에서 명령 출력을 숨기는 방법 (0) | 2023.05.02 |
동기 코드를 비동기 호출로 래핑 (0) | 2023.05.02 |