paulo1205
(usa Ubuntu)
Enviado em 26/06/2014 - 01:52h
rai3mb escreveu:
luizsouza99 escreveu:
for (( loop=1;loop>0;loop++));do
sleep 10 # tempo que ele segura o loop, 10 segundos
#código aqui dentro
done
Cuidado ai, tem uma variável que está sendo incrementada infinitamente, vai usar memória e vai crescer até não ser mais possíve.
Comer memória? Por quê?
Versões antigas do bash tinham, sim, um bug que os fazia comer memória se executassem por muito tempo, mas não porque uma variável tinha seu valor alterado, e sim porque ele alocava um pouquinho de memória a cada vez que um comando era executado, e acabava não liberando quando o comando acabava. (Na empresa em que eu trabalhava, por volta do ano 2000, constatamos esse bug da pior maneira, numa máquina que ficava num cliente ao qual não tínhamos acesso remoto, e no qual volta e meia a máquina dava pau. Por "sorte", eu descobri o problema durante uma visita preventiva, poucas horas antes, segundo contas que fizemos depois, da máquina ficar totalmente sem memória. A solução, naquela época, foi trocar o script em bash por um feito em Perl.)
poderia ser feito sem variável com:
while :
do
#codigo a ser executado
sleep 10
done
Minha ideia na primeira postagem era que ele descobrisse isso por conta própria, usando as dicas que eu dei sobre os comandos
while,
: e
sleep e um pouquinho de pesquisa. Não gosto muito da ideia de entregar a solução de bandeja.
Contudo, esse comando não necessariamente será executado de dez em dez segundos, como pediu inicialmente o autor da postagem. Digamos que os comandos antes do
sleep levem 9 segundos para executar; nesse caso o comando só será executado a cada 19 segundos (os 9 da execução mais os 10 da espera).
Se isso servir para ele, OK. Se não, ter-se-ia de fazer algo mais elaborado. Por exemplo.
while : ; do
# Usa um arquivo de lock para impedir execução simultânea,
# caso a execução leve mais do que dez segundos.
if [[ ! -e /tmp/lockfile ]]; then
touch /tmp/lockfile
{
# comandos a executar
rm /tmp/lockfile
} & # Note o "&" para execução em background.
fi
sleep 10
done