Enviado em 01/08/2011 - 10:07h
Olá ;) Este é a minha primeira participação neste forum e espero que não seja a última :)
#!/bin/bash
################################################################################################
# Autor...............: AprendizNoLinux
# Versão..............: 0.09
# Última alteração....: 31-Julho-2011
################################################################################################
# Script Name: CheckContador
################################################################################################
# Objetivo............: Faz acesso exclusivo a um determinado arquivo e atualiza seu contador.
# Parametros..........: 1 - Endereço físico onte deverá estar o arquivo para o contador.
# ....................: 2 - Nome do arquivo que será atualizado o contador.
# ....................: 3 - Quantidade máxima que o arquivo contador poderá ter.
# ....................: 4 - Máquina que solicitou o contador.
# ....................: 5 - Usuário que solicitou o contador.
# ....................: 6 - Arquivo de Log da operação se ativado.
################################################################################################
# Cenário ideal: Ter um serviço rodando no servidor que recebe os parametros e faz o acesso
# a cada arquivo ele mesmo e devolve ao script que solicitou o resultado um número, arquivo,
# ou outro detalhe. Depende dos parametros que ele recebe.
# O problema é que este acesso precisa de exclusividade.
# São mais de 50 máquinas que tentam acesso a vários arquivos de contadores.
# Estou passando as definições dos parâmetros para facilitar o entendimento do pessoal.
################################################################################################
MyProg="Contador1.sh" # Deve ser recebido por parâmetro. OBRIGATÓRIO
MyArquivoContador="Contador1.txt" # Arquivo contador que deverá ser enviado por parâmetro via php. OBRIGATÓRIO.
MyValorTotalContador=20 # Informa o valor máximo para o contador. Ao atingir este número será reduzido a 1.
Tentando=10 # Vai ficar tentando até chegar neste valor total
MyArqDebug="Debug_$MyProg-$MyArquivoContador" # Variável de controle para gerar o arquivo de Debug das operações.
DEBUG=1 # Se o debug está com 0 (zero), não entra nas rotinas de paradas. Se 1, roda debug salvando detalhes e paradas.
ExecutaPassoPorPasso=0 # Se o Debug está ativado e este parâmetro for deixado com 1, faz o debug passo a passo.
TravaDoArquivo="TRAVA_"$(echo $MyArquivoContador | sed "s/\..*//g")".temp" # Arquivo de trava para minimizar conflitos de gravação e acesso no momento do processamento.
if test -f $TravaDoArquivo
then
echo "=================================================================="
echo [Maquina: $(uname -n)]-[IdUser: $(id -u)]-[Usuário: $(whoami)]
echo "=================================================================="
echo " Arquivo em uso por outro usuário ou terminal "
echo "=================================================================="
UserLockFile=$(cat $TravaDoArquivo )
echo "Usando o arquivo: $UserLockFile "
source ProgressBar.sh 10
else
echo "=================================================================="
echo [Maquina: $(uname -n)]-[IdUser: $(id -u)]-[Usuário: $(whoami)]
echo "=================================================================="
echo " Arquivo NÃO exite vamos trabalhar ???? Deixei aqui para entender que agora vou fazer o que for necessário"
# Criando o arquivo meia boca quebra galho de TRAVA para que os outros scripts não façam nada.
UserLockFile=$(echo $(uname -n) $(whoami) $(id -u) $(date "+%t##### Data: %d/%m/%Y%t ##### %tHora: %H:%M:%S #####"))
echo $UserLockFile > $TravaDoArquivo # Gravando arquivo de trava
fi
if [ $DEBUG == 1 ] # Se o debug estiver ativado irá gerar o arquivo de log.
then
clear
if [ $ExecutaPassoPorPasso = 1 ]
then
MyMensagem=" O Debug Está ativado. Tecle enter em cada operação."
MeuRetorno=[ . PauseScript.sh "$MyMensagem" ] # Executa Pausa no Script. Pressione enter para continuar.
$MeuRetorno
fi
echo "==================================================================" >> $MyArqDebug
echo Iniciando a gravação de Debug.... $(date) >> $MyArqDebug
echo [Maquina: $(uname -n)]-[IdUser: $(id -u)]-[Usuário: $(whoami)] >> $MyArqDebug
echo [Localização: $(pwd)]-[Script: $0] >> $MyArqDebug
echo "==================================================================" >> $MyArqDebug
else
# Debug não está ativado e não irá gravar os dados extras.
:
fi
MeuAcumulador=1 # Quantidade que será somada ao contador.
if test -f $MyArquivoContador
then
: # Já existe o arquivo e não será feito nada.
else # Debug PODE ou não estar desativado, momento é importante e iremos gravar a criação do arquivo assim mesmo.
MyMensagem=""
MyMensagem=" Criando o arquivo contador $MyMensagem agora."
MeuRetorno=[ . PauseScript.sh "$MyMensagem" ] # Executa Pausa no Script. Pressione enter para continuar.
$MeuRetorno
echo "==================================================================" >> $MyArqDebug
echo [Criando arquivo contador: $MyArquivoContador em: $(date)] >> $MyArqDebug
echo [Maquina: $(uname -n)]-[IdUser: $(id -u)]-[Usuário: $(whoami)] >> $MyArqDebug
echo [Localização: $(pwd)]-[Script: $0] >> $MyArqDebug
echo "==================================================================" >> $MyArqDebug
MeuAcumulador=0
echo $MeuAcumulador > $MyArquivoContador # Salvando o arquivo acumulador com o valor incializado com 0
fi
MeuContadorAnterior=$(cat $MyArquivoContador | tr -d -c 0-9 ) # Pega o valor existente do arquivo para executar adição de contador. Trata para ter certeza que só teremos números.
let MeuContadorAtual=MeuContadorAnterior+1 # Transformando e acionando 1 na variável do contador atual.
if (("$MeuContadorAtual > $MyValorTotalContador"))
then
MeuContadorAtual=1
echo "============================================================="
echo "Reduzido p/1. Anterior: $MeuContadorAnterior valor MÁXIMO é: $MyValorTotalContador "
echo "============================================================="
else
:
# echo "============================================================="
# echo "Quantidade ANTERIOR era $MeuContadorAnterior e agora será $MeuContadorAtual "
# echo "============================================================="
fi
# Neste momento já temos o novo contador para gravar no arquivo. A gravação será feita o mais rápido possível.
if [ $DEBUG == 1 ] # Se o debug estiver ativado irá gerar o arquivo de log.
then
echo "=================================================================="
echo [Maquina: $(uname -n)]-[Usuário: $(whoami)]-[$(date)]
echo [#######] Contador anterior: $MeuContadorAnterior ------\> Contador atual $MeuContadorAtual [#######]
echo "=================================================================="
echo "==================================================================" >> $MyArqDebug
echo [Maquina: $(uname -n)]-[Usuário: $(whoami)]-[$(date)] >> $MyArqDebug
echo [#######] Contador anterior: $MeuContadorAnterior ------\> Contador atual $MeuContadorAtual [#######] >> $MyArqDebug
echo "==================================================================" >> $MyArqDebug
. PauseScript.sh
fi
echo $MeuContadorAtual > $MyArquivoContador # Gravação efetiva do arquivo com o novo contador.
# Liberando o arquivo de trava.
# Aqui eu apago o arquivo de TRAVA temporário. Termina o seu trabalho enviando as informações ao script que solicitou as infos...