Tem como evitar carregar 2 vezes o mesmo source ? [RESOLVIDO]

1. Tem como evitar carregar 2 vezes o mesmo source ? [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 11/08/2011 - 19:58h

Estou com um problema que não encontro solução sem fazer uma POG. (Programação orientada a gambiarras.)

Tenho um aplicativo principal que carrega arquivos na inicialização via código source.
Em algum outro ponto e não necessariamente no mesmo Script que solicitou o source, eu preciso testar se já foi carregado para memória via source este arquivo.
Exemplo:

1º arquivo executado:

======== início aqui ==================
#!/bin/bash
#
#: package: Acessos (nome de exemplo p/ Script ou executável final) (***)
#: file: acessos.principal.sh (Do Script atual)
# Retirado o cabeçalho completo para não poluir demais.
# -----------------------------------------------------------------------------
# Iniciando o aplicativo finalmente.
# -----------------------------------------------------------------------------
# Deve ser o diretório do INSTALL
# Carrega somente uma vez caso não exista ainda.
# Deve garantir que o diretório atual é o da instalação.
# Somente o aplicativo principal faz este teste.
[ "$DIR_INSTALL" ] || DIR_INSTALL="$PWD"

# Variável que irá controlar se a instalação está OK em qualquer momento.
# Controla o STATUS do aplicativo e da versão.
# 1="OK" - 0="Algum problema de instalação ERRO FATAL 004"
# Inicializada em 0 ( não OK ) Default
INSTALL_OK=0

source config.principal.acessos.include.sh #Carrega todas configurações.
source config.principal.acessos.include.sh #Carrega todas configurações.
source config.principal.acessos.include.sh #Carrega todas configurações.

echo "o que vale a variável INSTALL_OK ?? [ $INSTALL_OK ] "
read
exit

============= agora o arquivo config.principal.acessos.include.sh
#!/bin/bash
#
#: package: Acessos (***)
#: file: config.principal.acessos.include.sh
#: since: 2011-08-11 17:27 (GMT -03:00)
#: author: Geraldo T. Albuquerque - Twitter: @AprendiNoLinux
#: version: 0.07 Alfa
#: dir: Raiz do aplicativo principal.
#------------------------------------------------------------------------------
#: objectives: 1º arquivo de configuração a ser carregado.
#------------------------------------------------------------------------------
#: comments: Aplicativo não vai trabalhar enquanto não confirmar as alterações.
#: Após alterar as configs, conseguirá testar o aplicativo.
#: FIXME Lembrar de remover mensagens temporárias.
#------------------------------------------------------------------------------

function _config.principal {

# Contém o caminho completo ao home do usuário.
# Poderá ser usado como um caminho raiz para seus diretórios internos.
# Se mudar este valor por padrão, mudará todas localizações dos arquivos.
# Todas as variáveis de diretórios herdam o que está definido em _HOME
# Tome cuidado e confira a sua estrutura de diretórios.
_HOME="$HOME"

# Padrão na instalação é sempre 0 (não configurado)
# 1="OK" 0="Não está configurado para trabalhar !!!"CONFIG_INSTALL=0
CONFIG_INSTALL=1

# Precisa verificar se está tudo configurado corretamente.
# Quem deve carregar o ambiente é este Script.
# Se você não configurar os diretórios corretamente, vai executar o padrão.
# Padrão dos testes é:
# Diretório de Scripts: $HOME/TESTES/Scripts

if [ "$CONFIG_INSTALL" -eq 0 ]
then
INSTALL_OK=0 # Falhou nas configurações básicas. (Redundante)
# Talvez seja interessante que após receber esta mensagem, abrir o editor
# já carregando o arquivo necessário para configuração.
# TODO Descobrir como pode ser feito com segurança.
clear
echo +----------------------------------------------------------------------+
echo " ERRO FATAL 001: !!!"
echo +----------------------------------------------------------------------+
echo " Você não ajustou a chave principal de CONFIGURAÇÃO. !!!"
echo +----------------------------------------------------------------------+
echo " Editar e ler as instruções do arquivo abaixo. "
echo +----------------------------------------------------------------------+
echo " PASTA/Arq: $PWD/config.principal.acessos.include.sh "
echo +----------------------------------------------------------------------+
echo " Deseja configurações fora do padrão? Edite outros configs."
echo " Veja o aquivo: EstruturaDosDiretorios.txt em docs para mais detalhes."
echo " Caso seu desejo seja fora do padrão, edite o arquivo abaixo:"
echo +----------------------------------------------------------------------+
echo " PASTA/Arq: $PWD/config.local.acessos.include.sh "
echo +----------------------------------------------------------------------+
echo " Aplicativo será abortado e só irá trabalhar após as alterações."
echo +----------------------------------------------------------------------+
echo -n " Tecle ENTER para sair !!!"
read x
clear
exit
else
INSTALL_OK=1 # Instalação está OK
fi
return
}

function _config.ambiente {

# Configure abaixo o seu ambiente de operação se for fora do padrão.
# Para fazer ajustes finos, acesse: ambiente.bash.include.sh
CONFIG_AMBIENTE="${_HOME}/TESTES/Scripts"

if test -d "$CONFIG_AMBIENTE"
then
INSTALL_OK=1 # Instalação está OK
else
clear
echo +----------------------------------------------------------------------+
echo " ERRO FATAL 002: !!!"
echo +----------------------------------------------------------------------+
echo " Não encontrou a pasta de CONFIGURAÇÃO para o AMBIENTE. !!!"
echo +----------------------------------------------------------------------+
echo " Editar e ler as instruções. "
echo +----------------------------------------------------------------------+
echo " PASTA/Arq: $PWD/config.principal.acessos.include.sh "
echo +----------------------------------------------------------------------+
echo " Se desejar configurações fora do padrão? Edite outros configs."
echo " Edite o aquivo:EstruturaDosDiretorios.txt em docs para mais detalhes."
echo " Se não usar o padrão realmente, edite o arquivo abaixo:"
echo +----------------------------------------------------------------------+
echo " PASTA/Arq: $PWD/config.local.acessos.include.sh "
echo +----------------------------------------------------------------------+
echo " Aplicativo será abortado e só irá trabalhar após as alterações."
echo +----------------------------------------------------------------------+
echo -n " Tecle ENTER para sair !!!"
read x
clear
exit
fi

# O ambiente poderá mudar se você não usar bash.
# Preparando variável para carregar o arquivo de ambiente bash.
INCLUDE_CONFIG_AMBIENTE="${CONFIG_AMBIENTE}/ambiente.bash.include.sh"

if test -e "$INCLUDE_CONFIG_AMBIENTE"
then
source $INCLUDE_CONFIG_AMBIENTE
INSTALL_OK=1 # Instalação está OK
else
INSTALL_OK=0 # Falhou nas configurações básicas. (Redundante)
clear
echo +----------------------------------------------------------------------+
echo " ERRO FATAL 003: !!!"
echo +----------------------------------------------------------------------+
echo " Você deve ter ajustado o arquivo de CONFIGURAÇÃO errado. !!!"
echo +----------------------------------------------------------------------+
echo " Retorne ao arquivo principal de configuração. "
echo +----------------------------------------------------------------------+
echo " PASTA/Arq: $PWD/config.principal.acessos.include.sh "
echo +----------------------------------------------------------------------+
echo " Confira também as suas configurações locais em: "
echo " PASTA/Arq: $PWD/config.local.acessos.include.sh "
echo +----------------------------------------------------------------------+
echo " Para mais detalhes, veja o aquivo:EstruturaDosDiretorios.txt "
echo " Você deve ter configurado para trabalhar fora do padrão. "
echo +----------------------------------------------------------------------+
echo " Aplicativo será abortado e só irá trabalhar após ajustes."
echo +----------------------------------------------------------------------+
echo -n " Tecle ENTER para sair !!!"
read x
clear
exit
fi
return

}

_config.principal #Executa as configurações principais.
_config.ambiente #Executa as configurações do ambiente shell bash.

echo $INSTALL_OK # Retorna o STATUS das configurações.
echo " Quantas vezes vai mostrar esta mensagem ? E agora José ? "

#------------------------------------------------------------------------------
#: Notas: Configuração principal é pequena, porém importante.
#------------------------------------------------------------------------------
#: Erros fatais numerados ajudam na solução de problemas.
#: Se bem usado, obriga o desenvolvimento prever problemas.
#------------------------------------------------------------------------------
#: INSTALL_OK previne chamadas diretas nas funções básicas em outros locais.
#: Se não resolver de outra forma, vou apelar para esta POG mesmo.
#------------------------------------------------------------------------------

================ final do segundo arquivo aqui. ============================

# Vai mostrar 3 vezes a mensagem que está dentro do config principal.
# Isto indica que ele não confere se o source já foi carregado.
# Como evitar mais de um carregamento em outros pontos ?

Alguém pode ajudar ?

Obrigadão antecipados.

@GA_Tux


  


2. MELHOR RESPOSTA

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 11/08/2011 - 21:42h

usando o source, o conteúdo do arquivo passa a fazer parte do script que o chamou, enão o que vai ser identificado os processos é o script que o chamou :-), acho que você pode simplesmente criar uma variável nesse arquivo e quando quiser saber se já foi carregado essa lib, basta checar se a variável em valor ou não.

Abraços

3. Re: Tem como evitar carregar 2 vezes o mesmo source ? [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 11/08/2011 - 20:08h

Se tiver um comando para eu saber os Scripts que já estão carregados na memória também serve :)

[editado]
BASH_SOURCE=([0]="./acessos.principal.sh")
[/editado]

Carregando o set no momento da execução, localizei o BASH_SOURCE. Acho que é exatamente isto que preciso, mas não achei. Este é o arquivo atual carregado.



4. Re: Tem como evitar carregar 2 vezes o mesmo source ? [RESOLVIDO]

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 11/08/2011 - 21:20h

O tópico ficou grande, deu preguiça de ler :-)

Mas acho que quer saber se um script carregado com source já foi carregado, é isso?


5. Re: Tem como evitar carregar 2 vezes o mesmo source ? [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 11/08/2011 - 21:24h

Buenas @rai3mb :)

É isto mesmo. Preciso saber se ele já está na memória.

ps: Eu cortei os arquivos pra enviar rrs. Deixei os comentários pra o pessoal ir acompanhando.

Obrigado pela atenção.




6. Re: Tem como evitar carregar 2 vezes o mesmo source ? [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 11/08/2011 - 21:36h

Descobri que se eu tentar pegar o array no segundo Script que está sendo carregado, a variável bash citada tem valor.
Joguei em uma variável assim: _BASH_SOURCE1="${BASH_SOURCE[1]}"
O retorno dentro do config principal foi: config.principal.acessos.include.sh

Provavelmente quando eu capturar o 3º arquivo que será incluído pelo source em config.principal.acessos.include.sh deverá estar no BASH_SOURCE[2]

Então, ao sair do Script esta variável perde o seu valor. Estou vendo que vou ter que apelar para uma POG. rsrs




7. Re: Tem como evitar carregar 2 vezes o mesmo source ? [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 11/08/2011 - 21:49h

Ok @rai3mb , esta foi a solução que encontrei + ou - na POG.
Vou fazer como você falou. :) Valeu.

@GA_Tux

oops: Caso encontre outra solução eu aviso aqui.


8. Re: Tem como evitar carregar 2 vezes o mesmo source ? [RESOLVIDO]

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 11/08/2011 - 21:51h

Acho que alguma outra solução que busca-se se tal arquivo foi carregado na memória dispensaria mais recursos do que simplesmente testar se uma variável tem ou não valor :-)

Abraços


9. Como forçar nova carga com source atualizado ?????

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 11/04/2012 - 15:44h

Hoje em dia sigo a recomendação feita pelo profs @rai3mb e executo um teste em variável para saber se determinado arquivo está carregado em memória.
Minha dúvida agora está relacionada a eliminação e inclusão de source em memória.

Enunciado:
===========

a) Tenho um script que está sendo carregado via cron.
b) Tal script entra de hora em hora. Só para garantir que caso esteja inativo por algum motivo retorne ao trabalho.
c) Dentro do script existe uma construção que carrega via source outros arquivos.
d) Tais arquivos incluídos via source sofrem modificações de tempos em tempos.
e) Preciso forçar o recarregamento dos arquivos via source em memória assim o script pai saiba que um filho (source) tenha sido alterado após a primeira vez que foi carregado.

O problema:
===========

a) Como fazer para ele eliminar o source em memória? Será que existe esta possibilidade ?
b) Como forçar ele ser recarregado e assumir o arquivo do novo source ? Lembre-se que o 1º arquivo é disparado via cron e não posso ficar tirando ele do ar.
c) Tem como retirar o arquivo do ar que foi disparado via cron e reativa-lo novamente ?

Qualquer dica, sugestão ou ideia por mais mirabolante que seja estou disposto a tentar.

"Só acerta quem tenta. Quem não tentou já errou porque fez nada."
"Quem pergunta é bobo por 5 minutos. Quem não pergunta poderá ser bobo a vida inteira" (Provérbio Chinês)

Obrigado de antemão pela ajuda.



Veja também: http://www.vivaolinux.com.br/topico/Off-Code-Cafe/Acordando-com-Led-Zeppelin?pagina=17&num_por_p...







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts