Pular para o conteúdo

Shell Script com loop infinito

Responder tópico
  • Denunciar
  • Indicar

1. Shell Script com loop infinito

Enviado em 24/06/2014 - 17:30h

Prezados, boa tarde.

Preciso da vossa ajuda para criar um script que rode de 10 em 10 segundos com loop infinito. Por exemplo:

chmod -R 733 /home/usuario/DIRETORIO

Preciso dar permissão num diretório no intervalo de 10 segundos, como eu faria isso?

Agradeço desde já.

Geovani Oliveira.

Responder tópico

2. Re: Shell Script com loop infinito

Enviado em 24/06/2014 - 17:58h

Tem certeza de que a permissão é 733, ou seja, o grupo e os demais usuários podem gravar e executar, mas não ler? Esse diretório é um tipo de dropbox (i.e. qualquer um escreve, mas ninguém vê as coisas escritas por outrem, nem o conteúdo do próprio diretório)?

Os comandos que você vai usar são while, true (ou “:”) e sleep.

3. Re: Shell Script com loop infinito

Enviado em 24/06/2014 - 18:03h

for (( loop=1;loop>0;loop++));do
sleep 10 # tempo que ele segura o loop, 10 segundos


#código aqui dentro



done

4. Re: Shell Script com loop infinito

Enviado em 24/06/2014 - 21:59h

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.

poderia ser feito sem variável com:


while :
do
#codigo a ser executado
sleep 10
done

5. Re: Shell Script com loop infinito

Enviado em 25/06/2014 - 01:56h

eu sempre uso no pc dessa forma,

eu não sabia que comia memoria, aqui é tranquilo, mas se formos pensar a nível de servidor vc tem razão, deve dar maior dor de cabeça

6. Re: Shell Script com loop infinito

Enviado em 26/06/2014 - 01:29h

luizsouza99 escreveu:

for (( loop=1;loop>0;loop++));do
sleep 10 # tempo que ele segura o loop, 10 segundos


#código aqui dentro



done
Tecnicamente, esse loop não é infinito. Ele vai contar até o maior inteiro com sinal que caiba na representação da máquina, e depois o valor vai ficar negativo, encerrando o loop.

É claro que, com inteiros de 32 bits e com um intervalo de dez segundos entre cada incremento da contagem, todos nós já estaríamos para lá de mortos antes dessa virada acontecer. Com 64 bits, então, talvez nem mesmo o universo existisse mais, se as teorias dos físicos estivessem certas. Logo, na prática, sua solução, ainda que tecnicamente errada, serviria.

7. Re: Shell Script com loop infinito

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

8. Re: Shell Script com loop infinito

Enviado em 26/06/2014 - 08:02h

Parabéns!

9. Resposta:

Enviado em 09/06/2015 - 01:36h


while true; do
chmod -R 733 /home/usuario/DIRETORIO
sleep 10
done

10. Re: Shell Script com loop infinito

Enviado em 09/06/2015 - 11:34h

A minha curiosidade aqui é por que seria necessário dar a permissão 733 a cada dez segundos...
--
Luís Fernando Carvalho Cavalheiro
Public GPG signature: 0x246A590B
Só Slackware é GNU/Linux e Patrick Volkerding é o seu Profeta

11. Re: Shell Script com loop infinito

Enviado em 09/06/2015 - 12:52h

Com o for pode ser feito assim:
for (( ; ; ))
do
# codigo
sleep 10
done

Mas essa permissão 733 está me intrigando também.

Ah sim, ótima solução paulo1205.
--
sudo make me a sandwich

Responder tópico

Responder tópico

Entre na sua conta para responder.

Fazer login para responder