Shell Script com loop infinito

1. Shell Script com loop infinito

Geovani Oliveira
manager

(usa Ubuntu)

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.


  


2. Re: Shell Script com loop infinito

Paulo
paulo1205

(usa Ubuntu)

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

luiz
luizsouza99

(usa Linux Mint)

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

Raimundo Alves Portela
rai3mb

(usa Outra)

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

luiz
luizsouza99

(usa Linux Mint)

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

Paulo
paulo1205

(usa Ubuntu)

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

Paulo
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



8. Re: Shell Script com loop infinito

Raimundo Alves Portela
rai3mb

(usa Outra)

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

Parabéns!


9. Resposta:

Rodrigo Matos
ravi

(usa Red Hat)

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

Luís Fernando C. Cavalheiro
lcavalheiro

(usa Slackware)

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

thinomar
thinomar

(usa Linux Mint)

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



  



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts