Como fazer um cronômetro regressivo em Shell Script [RESOLVIDO]

1. Como fazer um cronômetro regressivo em Shell Script [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 11/05/2012 - 12:01h

Tenho uma rotina que roda em background no cron. A dita entra a cada 60 minutos, ou de hora em hora.
Preciso criar um "[*****]ômetro" ou cronômetro regressivo que dentro do loop precisa ir regredindo até quando faltarem 2 minutos para a nova entrada do cron.
Pegar o momento em que o cron é disparado eu sei, o problema é como criar esta variável para ir decrementando seu valor até faltarem 2 minutos.
Já andei pesquisando sobre o assunto, mas só encontrei bons tutoriais sobre o cron:

http://www.vivaolinux.com.br/dica/Agendamento-de-tarefas-no-Linux-%28cron-e-at%29
http://www.vivaolinux.com.br/artigo/Agendando-tarefas-em-Linux-Unix-usando-o-cron

Tem de tudo, até como retirar o serviço do ar. Mas não encontrei nada referente a cronômetros regressivos.
O script que estou rodando é super pesado e faz gravações e leituras intermitentes. Costuma deixar a memória meio suja e descarregar o danado é importante. Ele chama em bg outros 200 a 500 serviços. Depende do momento e da hora. Percebi que descarregar eles da memória dentro de um período de 60 minutos será suficiente para evitar gargalos.

O que estou imaginando é mais ou menos assim.

Dentro do loop while principal, fazer uma chamada para um função que vai verificar o tempo decorrido desde o momento que foi iniciado. Deverá ler algum parâmetro que indicará o tempo ou contador para sair do ar. Se este número for inferior ao parâmetro x ou y, deverá disparar as rotinas de encerramento que vai providenciar várias limpezas.
A ideia é que acabe tudo antes que o novo cron entrar no ar. Lembrando que ele entra a cada 60 minutos.

Estou bem perdido pra falar a verdade em como devo fazer esta rotina regressiva.

Estou pensando em converter a data para segundos desde 1970 ( date "+%s" que devolve 1336748357) , onde imagino que seja meu start. Agora qual o valor futuro com 60 minutos a frente ?
Qual a melhor forma de fazer estes contadores ? O caminho seria este mesmo ?

Sugestões, todas bem-vindas ;)

Editado: 12:05
Algo similar ao tratado aqui: http://www.vivaolinux.com.br/topico/Shell-Script/Script-para-marcar-tempo

Editado: 12:12
A dica do @fdmarp deu uma luz, mas ainda não é o que preciso. Nem sempre será de 60 minutos. Estou dando este exemplo com 60 minutos.


#/bin/sh
# ROTINA DE VARIACAO DE SEGUNDOS ENTRE DUAS DATAS
# Codigo pertence a Comunidade
# VOL (Viva o Linux)
#-------------------------------------------------------
# Primeira versao: Davison Pasqualini
# 30/12/2009 fdmarp
#-------------------------------------------------------

data_inicial=`echo $1 | awk -F/ '{ print $2"/"$1"/"$3 }'`
data_final=`echo $3 | awk -F/ '{ print $2"/"$1"/"$3 }'`
hora_inicial=$2
hora_final=$4
data_seg1=`date +%s --date="$data_inicial $hora_inicial"`
data_seg2=`date +%s --date="$data_final $hora_final"`
resultado=`expr $data_seg2 - $data_seg1`
echo $resultado




  


2. Re: Como fazer um cronômetro regressivo em Shell Script [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 11/05/2012 - 12:27h

Está certo isso ?
A ideia é a seguinte.
A hora tem 60 minutos. Cada minuto tem 60 segundos. Faço o registro do parâmetro em segundos. Se quero 1(uma) hora seria 60*60 = 3.600 segundos.
Então eu pego o timestamp de agora e somo + 3600 = 1336753238


hora_final=$(expr $(date "+%s") + 3600)


Então eu fico pegando a hora atual em timestamp e fazendo a conta.


hora_atual=$(date "+%s")


Resulta em: 1336749886

Hora final 1336753238 - hora atual 1336749886 = 3.352 segundos faltantes. Divido por 60 = 55.8666666 ai foi froide. Faltan 55 minutos e desprezo o restante ???

Editado: 12:31
Putz, tenho o timestamp da hora final [1336753238] como colocar ela em date hora:minutos:segundos novamente ?
Editado: 12:49 Resolvido.
Eu mesmo já tinha batido lata no passado com isso rrs: http://www.vivaolinux.com.br/topico/Shell-Script/Converter-string-de-data-formatada-para-UNIXTIME#5

date -d @1336753238 +%F-%R-%S 

Resulta em: 2012-05-11-13:20-38



3. [MELHOR RESPOSTA] - cronômetro regressivo em Shell Script

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 11/05/2012 - 17:44h

Função monta um cronômetro regressivo com base em segundos. Você pode modifica-lo para trabalhar com minutos e até horas.
Trabalha com 1(uma) variável pública de controle. Se dentro do mesmo script fizer chamada para o cronometro mais de uma vez, deve dar unset na variável CONFIG_CRONOMETRO_REGRESSIVO_CARREGADA

A função roda foi incluída para ver como pode usar dentro de um script que fica monitorando se o tempo já acabou. Faça seus testes.

Lição de casa: Você pode integra-la em algum progress bar para acompanhar o tempo na tela.



#/bin/sh
# file: cronometro_regressivo.sh
# Cronômetro regressivo de tempo.
# Recebe a quantidade de segundos à frente.
# Mostra e compara momentos para retornar o tempo faltante.
# Pode ser melhorado para pegar datas futuras, etc...
# Se não informar o 1º parâmetro assume 1 hora (3600 segundos)
# Tem uma pegadinha. Descubra onde.
#----------------------------------------------------------------------------#
# Extra Param:
# 1 - Tempo em segundos para cronômetro regressivo.
# 2 - Atitude que deve tomar se fim do cronômetro [0]=nada
# Se diferente de 0(zero), vai executar função passada.
# 3 - Mostra hora inicial e final no cronômetro. [0]=não [1]=sim
# 4 - Mostra retorno de tempo fantande no loop ? [0]=não [1]=sim

function cronometro_regressivo()
{

CONFIG_SEGUNDOS_TIMEOUT=${1:-"3600"}
CONFIG_EXEC_FIM_CR=${2:-"0"}
CONFIG_MOSTRA_HORA_INI_FIM=${3:-"0"}
CONFIG_RETORNA_TEMPO=${4:-"0"}

if [ "${CONFIG_CRONOMETRO_REGRESSIVO_CARREGADA}" != "true" ]; then
CONFIG_CRONOMETRO_REGRESSIVO_CARREGADA="true"
lc_hora_ini=$(date "+%s")
declare -rxg CONFIG_HORA_FINAL=$(expr $lc_hora_ini + $CONFIG_SEGUNDOS_TIMEOUT)
fi

lc_hora_ini=$(date "+%s")
lc_hora_fim=${CONFIG_HORA_FINAL}
lc_faltam=$(expr $lc_hora_fim - $lc_hora_ini)
lc_hora_fim_conv=$(date -d @${CONFIG_HORA_FINAL} +%F-%R-%S)

c=0
while [ $c -lt 11 ]; do
lc_hora_ini=$(date "+%s")
lc_hora_fim=$CONFIG_HORA_FINAL
lc_faltam=$(expr $lc_hora_fim - $lc_hora_ini)

# Testa se passou o parâmetro de atitude.
# Vai executar o comando enviado no parâmetro.
if [ "${CONFIG_EXEC_FIM_CR}" != "0" ]; then
if [ "${lc_faltam}" -lt 1 ]; then
# Remover esta mensagem. Serve só para você testar.
echo "Vai executar o código do CONFIG_EXEC_FIM_CR: ${CONFIG_EXEC_FIM_CR}"
${CONFIG_EXEC_FIM_CR} #Executado o código enviado.
fi
else
if [ "${lc_faltam}" -lt 1 ]; then
break
fi
fi

sleep 1
clear

if [ "${CONFIG_MOSTRA_HORA_INI_FIM}" == "1" ]; then
lc_hora_ini_conv=$(date -d @${lc_hora_ini} +%F-%R-%S)
echo -n "Hora inicial.:${lc_hora_ini_conv} "
echo -n "Hora final...:${lc_hora_fim_conv} "
fi
echo -n "Faltam.......: $lc_faltam segundos... "
let c++
done

if [ ${CONFIG_RETORNA_TEMPO} == 1 ]; then
clear
echo $lc_faltam
fi

}
# EOF() func...

# Apenas um exemplo de uso chamando por outra função.
function roda()
{
local param1="$1" param2="$2" param3="$3"

let mc++
while [ $mc -lt 11 ]; do
let mc++
# chama cronômetro regressivo
cronometro_regressivo "$param1" "$param2" "$param3"
clear
echo "Veja que a configuração da hora final não muda:$CONFIG_HORA_FINAL"
sleep 5
done
}

#Exemplo. CUIDADO, para sua segurança, coloque os parâmetros entre aspas duplas.
roda "$1" "$2" "$3"

echo "NÃO POSSO VER ESTA MENSAGEM. EXIT NÃO FUNCIONOU"

exit


No terminal digite por exemplo:

 ./cronometro_regressivo.sh "35" "exit 1" "1"  



No meu caso, no lugar do "exit 1" coloco uma outra função para encerrar as atividades. FN_Encerra_APP

Descontração: CORRA QUE A POLICIA VEM AI








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts