Como saber se uma duração é superior a uma hora em vários scripts de shell?

4

Estou tentando verificar o tempo de execução e, se demorar mais de uma hora, retornar um erro, mas o código retorna falsos positivos de forma intermitente. Em firstRun.sh , eu li o tempo como:

export START_H='date +%H'
export START_M='date +%m'

e em secondRun.sh eu verifico a hora da seguinte forma:

CURRENT_H='date +%H'
CURRENT_M='date +%M'
TIME='expr $CURRENT_H - $START_H'

if [ $TIME -gt 0 ] && [ $START_M -lt $CURRENT_M ]; then
    echo "boot time is more than an hour"
fi

Alguém pode me ajudar a descobrir onde o problema pode estar? Existe alguma diferença entre o uso de && e -a na instrução if? Ou qualquer diferença entre usar [] e () ?

    
por user3705440 19.04.2015 / 22:36

2 respostas

8

export BOOT_TIME=$(date +%s)
current=$(date +%s)
(( current - BOOT_TIME >3600 ))  && echo "More than an hour"

%s retorna segundos desde 1970-01-01 00:00:00 UTC.

Discussão: por que os segundos são melhores

Suponha, por exemplo, que o horário de início (boot) seja 23:00 e que a hora atual seja 00:23. Então, $TIME é negativo e isso não funcionará:

if [ $TIME -gt 0 ] && [ $START_M -lt $CURRENT_M ]; then
    echo "boot time is more than an hour"
fi

Da mesma forma, suponha que a hora de início seja 12:03 e a hora atual seja 14:00. Então, o acima não funcionará também, desta vez por causa do teste de minutos.

    
por 19.04.2015 / 22:56
3

Duas preocupações aqui

  1. Você tem uma condição de corrida potencial ao definir a Hora e o Minuto da hora atual em declarações separadas (considere a rolagem de minutos no topo da hora).

  2. No seu primeiro trecho de script, você está usando %m para minutos (mas isso é na verdade meses). No segundo você está usando %M .

Minha recomendação é que você seria melhor com HHMM=$(date +'%H %M') e, em seguida, dividiria isso em duas partes. Melhor ainda, aproveite o tempo como um valor combinado de segundos desde a Época SECONDS=$(date --utc +'%s') e permita 3600 segundos na hora. (A parte --utc evita ser pego pela hora local muda duas vezes por ano.)

    
por 19.04.2015 / 23:35

Tags