Korn Shell: mostra o tempo decorrido em um formato específico

2

Em um arquivo de log, eu preciso imprimir o tempo decorrido, no seguinte formato:

"Process completed %s - Elapsed %s",
<time now in HH:MM:SS format>,
<difference from start date to end date in HH:MM:SS format>

Exemplo:

Process completed 23:57:59 - Elapsed 103:22:59

Como eu poderia conseguir isso?

    
por UltraCommit 12.02.2014 / 18:21

3 respostas

2

O Ksh tem um parâmetro especial SECONDS , que sempre contém o número de segundos desde a época. A avaliação de $SECONDS no início e no final do trabalho fornece os horários de início e término e a diferença é o tempo decorrido.

O tempo Unix não leva em conta os segundos bissextos: um dia no tempo Unix é sempre exatamente 84000 segundos. Portanto, a aritmética da hora do dia no tempo Unix é fácil.

start=$SECONDS
…
end=$SECONDS
elapsed=$((end - start))
printf 'Process completed %d:%02d:%02d - Elapsed %d:%02d:%02d\n' \
       $((end / 3600)) $((end / 60 % 60)) $((end % 60)) \
       $((elapsed / 3600)) $((elapsed / 60 % 60)) $((elapsed % 60))
    
por 13.02.2014 / 09:11
2

Assim ( Warning : aqueles de uma disposição sensível desviam o olhar agora - este é o ksh da velha escola):

t1='date '+%H:%M:%S''
sleep 2
t2='date '+%H:%M:%S''

t1h='expr $t1 : '\(..\):.*''
t2h='expr $t2 : '\(..\):.*''
t1m='expr $t1 : '..:\(..\).*''
t2m='expr $t2 : '..:\(..\).*''
t1s='expr $t1 : '..:..:\(..\)''
t2s='expr $t2 : '..:..:\(..\)''

hdiff='expr $t2h - $t1h'
mdiff='expr $t2m - $t1m'
sdiff='expr $t2s - $t1s'

if [ $tm1 -gt $tm2 ];then
    hdiff='expr $hdiff - 1'
    mdiff='expr $tm1 - $tm2'
fi
if [ $ts1 -gt $ts2 ];then
    mdiff='expr $mdiff - 1'
    sdiff='expr $sm1 - $sm2'
fi

if [ $hdiff -lt 10 ];then
    hdiff="0$hdiff"
fi
if [ $mdiff -lt 10 ];then
    mdiff="0$mdiff"
fi
if [ $sdiff -lt 10 ];then
    sdiff="0$sdiff"
fi
echo "Elapsed time $hdiff:$mdiff:$sdiff"
    
por 12.02.2014 / 20:04
1

Desculpe, isso é para bash, não notei que você queria shell korn até agora, eu não posso ajudar com isso, mas pode dar-lhe o princípio básico.

StartTime=$( date +"%s" )

# do some stuff
sleep 4

EndTime=$( date )
ElapsedSecs=$(( 'date -d"$EndTime" +%s' - StartTime  ))  
secs=$((  ElapsedSecs % 60    ))  
mins=$((  ( ElapsedSecs / 60 ) % 60    ))  
hrs=$((  ElapsedSecs / 3600    ))
EndTimeFormated=$( date -d"$EndTime" +"%H:%M:%S"  )  
echo "Process completed $EndTimeFormated - Elapsed " 'printf "%02d:%02d%02d\n" $hrs $mins $secs'
    
por 12.02.2014 / 19:06

Tags