Criar timer para script se encerrar

1. Criar timer para script se encerrar

Daniel P. L. Almeida
daniel.uramg

(usa Outra)

Enviado em 13/05/2013 - 16:20h

Olá pessoal

eu tenho um script que executa a cada hora e faz várias requisições em hosts via wget, porém este script não pode executar uma instância se já tiver outra em rodando, então criei uma função pra ele verificar se tem outro processo já rodando:

# Garante a execucao de apenas uma instancia do script
TMP_PID="/var/tmp/$SCRIPT.pid"
if [ -s "$TMP_PID" ]; then
PID=`cat $TMP_PID`
if [ "`ps | grep -E "(^$PID)|( ^$PID)" | grep script.sh | grep -v grep`" ]; then
FUNC_DEBUG "Script encerrado pois outra instancia em execução PID=$PID ("`ps | grep $PID`")"
logger "$PASTA/$PROG abortado pois Outra instancia em execução PID=$PID"
exit 3
fi
fi
echo $$ > $TMP_PID

Blz aparentemente funciona, no início achei que estava bem eficiente, só que de uns dias pra cá vim observar nos logs que as vezes o script fica muitas horas sem executar pois tem um processo travado, as vezes fica dias sem executar até eu ver e matar todos processos..

e agora percebi um bug pior ainda: dei `ps` e tinha um monte de instância do script em execução, daí mandei executar ele manualmente e mesmo assim ele executou (o processo daquele PID já tinha parado, mas tinham outros em execução)

então queria criar tipo um timer no script, por exemplo se ele demorar mais que 1 minuto no "wget" ele encerra e passa pro próximo, ou algo assim.

o script é bem grande por isso fica complicado de eu colar ele todo aqui, e ia acabar é confundindo mais ainda. O que ele faz basicamente é ler vários códigos de um BD e requisitar uma URL para este código via wget, salvar o resultado e passar pro próximo código até que se acabem.

alguém tem uma ideia??

Grato.


  


2. Re: Criar timer para script se encerrar

Ton Melo
IZhaq_Melo

(usa FreeBSD)

Enviado em 13/05/2013 - 16:23h


man sleep #?




3. Re: Criar timer para script se encerrar

Daniel P. L. Almeida
daniel.uramg

(usa Outra)

Enviado em 13/05/2013 - 16:26h

IZhaq_Melo escreveu:


man sleep #?



a questão é como "dizer" pro sleep o que ele tem de esperar no script


4. Re: Criar timer para script se encerrar

Ton Melo
IZhaq_Melo

(usa FreeBSD)

Enviado em 13/05/2013 - 16:42h

http://stackoverflow.com/questions/2047884/limit-wgeting-by-timer-how-to-do-this

( wget ... & sleep 3600; kill %1 )



5. Re: Criar timer para script se encerrar

Daniel P. L. Almeida
daniel.uramg

(usa Outra)

Enviado em 13/05/2013 - 16:56h

IZhaq_Melo escreveu:

http://stackoverflow.com/questions/2047884/limit-wgeting-by-timer-how-to-do-this

( wget ... & sleep 3600; kill %1 )

Assim da certo em partes, pois se o wget demorar o tempo ele mata o script, só que queria que ele encerrasse somente o wget, pro script passar para o próximo código

o wget da minha distribuição não tem o parâmetro -T


6. Re: Criar timer para script se encerrar

Ton Melo
IZhaq_Melo

(usa FreeBSD)

Enviado em 13/05/2013 - 17:02h

da forma que voce quer vai ter que consultar o return na documentação do wget.
tive um problema similar em um AIX mas nao final ele fazia um ping e nem sempre o retorno era padronizado, voce mesmo viu que ele travou em algumas vezes como comentado por você.
Me pergunto será que essa é a melhor solução??

o nosso pior problema é o retorno do wget entao podemos criar um semáforo para gerenciar isso?


7. Re: Criar timer para script se encerrar

Fernando
phoemur

(usa Debian)

Enviado em 13/05/2013 - 23:33h

E se você jogasse os wget diretamente pro background, assim ele tentaria um número de vezes definido e se não desse certo beleza, dessa forma não trava o script...


wget -q --read-timeout=0.0 --waitretry=5 --tries=20 --background http://<URL>


Já quanto ao PID lock eu acho que você deveria contemplar a possibilidade de a pessoa por exemplo acabar a energia e ficar com o arquivo lá porém sem processo rodando... Aqui no meu eu fiz algo assim e ele nunca executa dois processos simultâneos:


# Defining PID lock
PID_DIR=/var/run
if [ ! -d "$PID_DIR" ]; then
mkdir $PID_DIR
fi
PID_LOCK="$PID_DIR/$SCRIPTNAME.pid"

function daemon()
{
if [ -f $PID_LOCK ]; then
ps ax | grep $(cat $PID_LOCK) | grep -v grep
if [ $? = 0 ]; then
echo -e '{TEXTO}33[05;31mDaemon is already running...'; tput sgr0
exit $E_RUNNING
else
rm $PID_LOCK
daemon
fi
else
echo "$$" > $PID_LOCK
while true; do
get_mem # aqui são minhas funções, desconsidere
sleep 1 #
clear_cache #
sleep $SLEEPTIME
done
fi
}



Eu quebrei a cabeça bastante com isso, dá uma olhada nesse script http://www.vivaolinux.com.br/script/Limpar-o-cache-da-memoria-RAM-apenas-quando-necessario
a versão 3 que eu postei em 08/05 é a que estou falando, aliás estou aceitando sugestões, é complicado aprender as coisas sozinho na raça...rs

Essa implementação do daemon também foi bem chatinha, talvez possa te ajudar, veja lá.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts