![명령이 완료된 후 지속 시간, 시작 시간, 종료 시간](https://linux55.com/image/185738/%EB%AA%85%EB%A0%B9%EC%9D%B4%20%EC%99%84%EB%A3%8C%EB%90%9C%20%ED%9B%84%20%EC%A7%80%EC%86%8D%20%EC%8B%9C%EA%B0%84%2C%20%EC%8B%9C%EC%9E%91%20%EC%8B%9C%EA%B0%84%2C%20%EC%A2%85%EB%A3%8C%20%EC%8B%9C%EA%B0%84.png)
명령이 완료된 후 다음과 같은 보고서를 받고 싶습니다.
Start Time: 02/01/21 01:27pm
End Time: 02/01/21 02:29pm
Total Duration: 01 Hour 02 Minutes
를 사용하여 시작 시간과 종료 시간을 얻을 수 있다는 것을 알았습니다 date +"%d/%m/%y %I:%M%P"
.
예를 들어,
start=$(date +"%d/%m/%y %I:%M%P")
start_duration=$(date +%s)
youtube-dl
end=$(date +"%d/%m/%y %I:%M%P")
end_duration=$(date +%s)
runtime=$((end_duration-start_duration))
echo "Start Time: ${start}"
echo "End Time: ${end}"
문제가 거의 없습니다.
- 인쇄하는 방법을 모르겠습니다.
Total Duration: 01 Hour 02 Minutes
youtube-dl
이 스크립트 내에서뿐만 아니라 모든 명령을 사용할 수 있도록 이 스크립트를 일반화하려면 어떻게 해야 합니까 ?
나는 시도했다:
#! /bin/bash
Before=$(date +%s)
echo "$Before"
exec "$@"
ret=$?
After=$(date +%s)
echo "$After"
let Duration=After-Before
echo "$Duration"
if [[ $ret -eq 0 ]]
then
echo "Start Time: ${Before}"
echo "End Time: ${After}"
echo "Total Duration: ${Duration}"
return $ret
else
echo "Error: Command [ $@ ] returned $ret"
echo "Start Time: ${Before}"
echo "End Time: ${After}"
echo "Total Duration: ${Duration}"
return $ret
fi
하지만 내가 사용하면 작동하지 않습니다ctrl+c
$ ./reporttime tail -f ~/.xsession-errors
Cinnamon warning: Log level 128: posix_spawn avoided (fd close requested)
Cinnamon warning: Log level 128: posix_spawn avoided (fd close requested)
Cinnamon warning: Log level 128: posix_spawn avoided (fd close requested)
Cinnamon warning: Log level 128: posix_spawn avoided (fd close requested)
Cinnamon warning: Log level 128: posix_spawn avoided (fd close requested)
Cinnamon warning: Log level 128: posix_spawn avoided (fd close requested)
Cinnamon warning: Log level 128: posix_spawn avoided (fd close requested)
Cinnamon warning: Log level 128: posix_spawn avoided (fd close requested)
Cinnamon warning: Log level 128: posix_spawn avoided (fd close requested)
Cinnamon warning: Log level 128: posix_spawn avoided (fd close requested)
Cinnamon warning: Log level 128: posix_spawn avoided (fd close requested)
^C
실제로 이후에는 아무것도 실행될 수 없습니다.exec "$@"
% ./reporttime cat reporttime
1609655953
#! /bin/bash
Before=$(date +%s)
echo "$Before"
exec "$@"
ret=$?
After=$(date +%s)
echo "$After"
let Duration=After-Before
echo "$Duration"
if [[ $ret -eq 0 ]]
then
echo "Start Time: ${Before}"
echo "End Time: ${After}"
echo "Total Duration: ${Duration}"
return $ret
else
echo "Error: Command [ $@ ] returned $ret"
echo "Start Time: ${Before}"
echo "End Time: ${After}"
echo "Total Duration: ${Duration}"
return $ret
fi%
답변1
그리고 zsh
:
zmodload zsh/datetime
TIMEFMT='Total duration for %J: %*E'
preexec() strftime 'Start Time: %d/%m/%y %I:%M%P'
precmd() strftime 'End Time: %d/%m/%y %I:%M%P'
REPORTTIME=0
그런 다음 명령줄을 입력할 때 시작 시간, 다음 프롬프트가 표시되기 전 종료 시간, 내장되지 않은 각 명령의 기간(보다 정확하게는 쉘이 기다리는 각 프로세스에 대해)을 인쇄합니다.
$ sleep 1; sleep 2
Start Time: 02/01/21 08:31am
Total duration for sleep 1: 1.002
Total duration for sleep 2: 2.003
End Time: 02/01/21 08:31am
예를 들어 CPU 시간이 10초 이상 소요되는 명령에 대한 시간만 보고 REPORTTIME=0
하도록 변경할 수 있습니다 .REPORTTIME=10
과거시간) 또는 시간을 측정할 각 명령 앞에 접두사를 붙입니다 time
.
실행하려면 임의의 명령이 필요한 스크립트로 다음을 수행하십시오.
#! /bin/zsh -
zmodload zsh/datetime
TIMEFMT='Total duration: %*E'
strftime -s start 'Start Time: %d/%m/%y %I:%M%P'
{
duration=$(
exec 4>&2 2>&1 1>&3 3>&-
time "$@" 2>&4 4>&-
)
} 3>&1
ret=$?
strftime -s end 'End Time: %d/%m/%y %I:%M%P'
print -rlu2 $start $end $duration
exit $ret
그런 다음:
$ ./reporttime sleep 65
Start Time: 02/01/21 09:26am
End Time: 02/01/21 09:26am
Total duration: 1:05.00
종속성 외에도 특수 변수(또는 / 1초 미만의 세분성을 원하는 경우) 를 time
사용할 수도 있습니다.$SECONDS
$EPOCHSECONDS
$EPOCHREALTIME
$epochtime
#! /bin/zsh -
zmodload zsh/datetime
start=($epochtime)
"$@"
end=($epochtime) ret=$?
strftime >&2 'Start Time: %FT%T.%3.%z' $start
strftime >&2 'End Time: %FT%T.%3.%z' $end
printf >&2 'Total duration: %.3f\n' $((
end[1] - start[1] + (end[2] - start[2]) / 1e9
))
exit $ret
이번에는 표준적이고 명확한 시간 형식을 사용합니다.
$ ./reporttime2 sleep 1
Start Time: 2021-01-02T09:50:49.261+0000
End Time: 2021-01-02T09:50:50.264+0000
Total duration: 1.003
Ctrl+ C또는 Ctrl+를 눌렀을 때 이러한 타이밍이 보고 되도록 하려면 다음을 추가하면 됩니다. \ 그렇지 않으면 zsh
명령과 시간이 모두 종료됩니다.
trap true INT QUIT
쉘이 이러한 신호를 가로채서 거기에서 죽지 않도록 이 스크립트의 맨 위에 있습니다. 이렇게 하지 마십시오 trap '' INT QUIT
. 신호가 완전히 무시되고 이 경우 시간 제한 명령이 종료되지 않습니다.