tempo de execução

1. tempo de execução

Lucas Doná Sfalcin
lucasdona

(usa Linux Mint)

Enviado em 25/04/2013 - 15:56h

Boa tarde galera, como executar alguns procedimentos de tempo em tempo, mas que seja preciso, utilizando shell script?
Um exemplo para entender melhor:

tenho o código abaixo:

#!/bin/bash
CONT=0
while [ $CONT -le 600 ]
do
comando1
comando2
comando3
comando4
comando5
CONT=$(($CONT+1))
sleep 1
done
comando6


No código acima, ele executará os comandos 1 até o 5 e aguardará 1 segundo, vai fazer isso 600 vezes que dá 10 minutos, mas é logico que o comando6 não será executado em 10 minutos, pois, os comandos levam também algum tempo para executar, então o comando6 será executado em 10min + o tempo de execução de todos os comandos do while. Existe alguma forma de executar o comando6 exatamente no momento esperado? sem eu ter que ficar tentando adivinha o tempo do sleep para dar os 10 minutos certinho?


  


2. Re: tempo de execução

Perfil removido
removido

(usa Nenhuma)

Enviado em 25/04/2013 - 16:50h

O tempo de execução pode ser de fração de segundos ... ou não.

Há um comando chamado time que mede esse tempo de execução que você quer.

Para comando em bloco, deve ser usado em bloco com chaves.

Você calcularia esse tempo e somaria. Quando o delay exceder 1 segundo, você cancela o sleep.

Mas fica bem complicado.

Outra forma é você capturar a data em uma variável, através do comando date e usar um loop while até a mudança de segundo.

complicado = ilegível? :\

Também complicado. Se eu me lembrar ou encontrar algum utilitário de texto, eu aviso.

EDIT: ortografia


3. Re: tempo de execução

Lucas Doná Sfalcin
lucasdona

(usa Linux Mint)

Enviado em 25/04/2013 - 23:37h

Esse time não conhecia, vou ver como funciona, derrepente posso fazer um sleep de 1 segundo - time (execução dos comandos). Ficaria +- assim:

#!/bin/bash
CONT=0
TEMPO=1
while [ $CONT -le 600 ]
do
time1
comando1
comando2
comando3
comando4
comando5
CONT=$(($CONT+1))
time2
timeSleep=$(( $TEMPO - ($time2 - time1) ))
sleep $timeSleep
done
comando6


Assim acho que fica bem próximo do esperado. Isso se o time contar em milisegundos ou algo parecido.


4. Re: tempo de execução

Paulo
paulo1205

(usa Ubuntu)

Enviado em 26/04/2013 - 02:08h

Não ficou muito claro para mim o que você quer fazer. Se o tempo de execução dos comandos em loop chegar a dez minutos, você aceitaria executá-los menos de seiscentas vezes, para executar o comando6 ao final do décimo minuto? Quer executar o comando6 após dez minutos, sem interromper o loop de seiscentas execuções dos outros cinco comandos?

Você poderia interromper o loop baseando-se apenas no tempo, independente da quantidade de repetiçõs, fazendo algo como segue. (Note que o exemplo usa recursos do Bash que não existem no shell padrão.)

#!/bin/bash

ts_inicial=$SECONDS
((ts_final=ts_inicial+600))

while (( $SECONDS < ts_final )); do
comando1; comando2; comando3; comando4; comando5
sleep 1 # pausa um segundo
done
comando6


Outra possibilidade é usar um processo paralelo para executar o loop, e matar tal processo após um tempo máximo decorrido. Só que isso pode ter o efeito colateral talvez indesejado de não executar todos os comandos. (O exemplo abaixo usa, com fins didáticos, somente recursos do shell padrão, sem os recursos mais avançados do bash -- note como fica mais chato fazer algo simples como incrementar o contador de número de execuções, dependendo-se de programas externos para fazer tal conta e para testar a condição de parada do loop.)

#!/bin/sh

(
count=0
trap 'echo Saindo apos $count iteracoes.; exit 1' 15
while [ "$count" -lt 600 ]; do
comando1; comando2; comando3; comando4; comando5
sleep 1
count=`expr $count + 1`
done
) &
sub_shell=$!

sleep 600 && kill $sub_shell
wait
comando6


Como shell não é muito a minha praia, pode ser que haja formas mais sucintas de fazer até mesmo o que eu indiquei aqui, além de outras formas completamente diferentes de obter resultados semelhantes.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts