명령이 완료된 후 지속 시간, 시작 시간, 종료 시간

명령이 완료된 후 지속 시간, 시작 시간, 종료 시간

명령이 완료된 후 다음과 같은 보고서를 받고 싶습니다.

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}"

문제가 거의 없습니다.

  1. 인쇄하는 방법을 모르겠습니다.Total Duration: 01 Hour 02 Minutes
  2. 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. 신호가 완전히 무시되고 이 경우 시간 제한 명령이 종료되지 않습니다.

관련 정보