Argumentos e opções. [RESOLVIDO]

1. Argumentos e opções. [RESOLVIDO]

Marcelo Caetano
marcelloinfoweb

(usa elementary OS)

Enviado em 09/05/2012 - 13:03h

Estou fazendo um sistema de Bkp para vários BD, sendo que gostaria de saber como posso fazer para colocar todas as informações das contas de BD em um script "main.sh" (onde tem todas as variáveis e dados de acessos) para que o script "bkp.sh" (onde tem somente um laço para a geração do bkp) reconheça e faça o backup de cada BD?

Pensei no seguinte:
No "main.sh", deixar no jeito para somente colocar uma linha de comando com os dados de acesso as bancos.
No "bkp.sh", não editar nada e torna-lo padrão para todo o processo.

############## ARQUIVO main.sh
#################################################
#!/bin/sh

echo "Acessando banco de dados."

# Dados para acessar o BD.
MyUSER="USUÁRIO" # USERNAME
MyPASS="sENHA" # PASSWORD
MyHOST="HOST" # Hostname
db="banco-de-dados" #DB

CHOWN="$(which chown)"
CHMOD="$(which chmod)"

# Montagem do HD Externo
echo "Montando HD Externo..."
mount /mnt/backup
echo "HD externo montado."

# Diretório Destino do backup.
DEST="/mnt/backup"

# Diretório principal onde o backup será armazenado
MBD="$DEST/aulasadistancia1"

# Obter nome do host
HOST="$(hostname)"

# Obter data no formato aaaa-mm-dd
NOW="$(date +"%Y-%m-%d")"

[ ! -d $MBD ] && mkdir -p $MBD || :

# Somente raiz pode acessá-lo!
$CHOWN 0.0 -R $DEST
$CHMOD 0600 $DEST

echo "Lendo banco de dados..."

# chama arquivo bkp.sh.
source /ASSISTEMAS/tools/test/bkp.sh

#Destagem do HD Ext
echo "Desmontando HD externo."
umount /mnt/backup
echo "HD externo Desmontado."
sleep 2
echo "---------------------------------------------"
echo "Backup e transferencia realizada com sucesso."
exit;



############## ARQUIVO bkp.sh
#################################################
#!/bin/sh

# Linux bin paths, change this if it can't be autodetected via which command
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
GZIP="$(which gzip)"

echo "Fazendo backup do banco de dados, aguarde..."

FILE="$MBD/$db.$HOST.$NOW.sql.gz"
$MYSQLDUMP --opt -u $MyUSER -p$MyPASS -h $MyHOST $db | $GZIP -9 > $FILE



  


2. MELHOR RESPOSTA

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 10/05/2012 - 22:03h

marcellocaetano escreveu:

Fiz umas mudanças nos dois scripts, tirei o excesso, se puder me orientar no atual agradeço muito.

Script alterado no início do post.

Obrigado por tudo.


ok ;) Melhorou.

Já entendi que o bkp.sh vai entrar como source. Então ele vai herdar todas as variáveis que estiver no main.sh
Finalmente entendi a finalidade do which mysql Vou ignorar que o teste não está sendo feito e vamos confiar que estão instalados.
O que você precisa fazer é alterar apenas o main.sh mais ou menos assim. Já tinha citado no outro exemplo.
As variáveis DEST="/mnt/backup" e MBD="$DEST/aulasadistancia1" podem mudar. Acho que talvez a variável FILE possa ser passada para parâmetro se quiser.
Se quiser, pode passar elas via parâmetros ou ter um arquivo auxiliar se achar que futuramente vale a pena.
Seria bom fazer um teste após a montagem do hd externo.
Para fazer isso funcionar, digite algo assim:

main.sh "UsurioDoSeuBancoDeDados" "SuaSenhaRootdeMySql" "SeuEndereçoDeHost" "SeuBandoDeDados"
A construção MyUSER=${1:-"USUÁRIO"} quer dizer que se você deve passar na linha de comando o usuário. Caso não faça, ele vai assumir o nome USUÁRIO. Faço sempre assim porque dentro do programa não posso correr o risco de ter variável nula ou vazia. Costumo fazer um teste nela e não deixar passar se vier com valores default.
Se o teu script bkp.sh estiver funcionando quando você digita na mão, vai funcionar fazendo desta forma.

Espero que agora tenha entendido. Não seria assim que faria, mas é uma forma rápida a que você deseja.
Lembrando: Se você tiver 10 hosts diferentes, crie um arquivo com todas as linhas de comando passando os dados nela.

 ./main.sh "UsurioDoSeuBancoDeDados" "SuaSenhaRootdeMySql" "SeuEndereçoDeHost" "SeuBandoDeDados"  

Se tiver 10 hosts, o arquivo acima terá 10 linhas.

Tive alguns problemas com HD externo. Hoje em dia procuro salvar o backup no HD local e depois de pronto transferir compactado para o hd externo. Depois testo para saber se o arquivo que está lá é igual ao arquivo do meu hd. No meu caso os backups demoram mais de 2 horas porque trabalho com terabytes de dados.



############## ARQUIVO main.sh
#################################################
#!/bin/sh

echo "Acessando banco de dados."

# Dados para acessar o BD.
MyUSER=${1:-"USUÁRIO"} # USERNAME
MyPASS="${2:-"SENHA" # PASSWORD
MyHOST=${3:-"HOST"} # Hostname
db=${4:-"banco-de-dados"} #DB

CHOWN="$(which chown)"
CHMOD="$(which chmod)"

# Montagem do HD Externo
echo "Montando HD Externo..."
mount /mnt/backup
echo "HD externo montado."

# Diretório Destino do backup.
DEST="/mnt/backup"

# Diretório principal onde o backup será armazenado
MBD="$DEST/aulasadistancia1"

# Obter nome do host
HOST="$(hostname)"

# Obter data no formato aaaa-mm-dd
NOW="$(date +"%Y-%m-%d")"

[ ! -d $MBD ] && mkdir -p $MBD || :

# Somente raiz pode acessá-lo!
$CHOWN 0.0 -R $DEST
$CHMOD 0600 $DEST

echo "Lendo banco de dados..."

# chama arquivo bkp.sh.
source /ASSISTEMAS/tools/test/bkp.sh

#Destagem do HD Ext
echo "Desmontando HD externo."
umount /mnt/backup
echo "HD externo Desmontado."
sleep 2
echo "---------------------------------------------"
echo "Backup e transferencia realizada com sucesso."
exit;




############## ARQUIVO bkp.sh
#################################################
#!/bin/sh

# Linux bin paths, change this if it can't be autodetected via which command
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
GZIP="$(which gzip)"

echo "Fazendo backup do banco de dados, aguarde..."

FILE="$MBD/$db.$HOST.$NOW.sql.gz"
$MYSQLDUMP --opt -u $MyUSER -p$MyPASS -h $MyHOST $db | $GZIP -9 > $FILE



3. Re: Argumentos e opções. [RESOLVIDO]

Osama Jr.
/bin/laden

(usa Void Linux)

Enviado em 09/05/2012 - 13:16h

Pq vc não faz assim:

1 - Cria um arquivo '.conf' e declara todas as variáveis nele
2 - No teu 'bkp.sh' fica toda a lógica de negócios

Ficaria mais organizado (e profissional também!).

Exemplo:

$ cat /tmp/arquivo.conf
VAR1='abc'
VAR2=123


$ cat script.sh
#!/bin/sh

# Carregando definicoes do arquivo de configuracao:
source '/tmp/arquivo.conf'

echo $VAR1

if [ $VAR2 -eq 123 ]; then
echo 'Valores numericos ok!'
exit 0
fi


Eh só uma sugestão... ;)


4. getopts ou getopt

Marcelo Caetano
marcelloinfoweb

(usa elementary OS)

Enviado em 10/05/2012 - 01:42h

Obrigado "/bin/laden" pela a atenção, mas procuro exatamente o seguinte:

Meu coordenador (empresa) sugeriu o getopts, mas estou com dificuldade de colocar em prática, como seria o funcionamento dele para definir por exemplo:

$MYSQLDUMP --opt -h $MyHOST -u $MyUSER -p$MyPASS $db | $GZIP -9 > $FILE 


Sendo que, para cada variável eu usaria, vários User de BD para fazer bkp?

Estou pensando assim:

while getopts "h:u:p:" OPT; do
case "$OPT" in
"h") MyHOST=$OPTARG;;
"u") MyUSER=$OPTARG;;
"p") MyPASS=$OPTARG;;
"b") db=$OPTARG;;
esac
done


Agora, como definir que:
BD: Cursos, Aulas e e-commerce usem a linha que faz a mysqsldump sem que alteremos o arquivo de bkp?

Deixando mais claro, eu quero declarar em algum lugar do script o seguinte:

$MYSQLDUMP --opt host usuário Senha banco-dados | $GZIP -9 > $FILE 

E ser entendido que as variáveis $MyHOST, $MyUSER, $MyPASS e $db serem reconhecidos automaticamente?

Desde já agradeço.


5. Re: Argumentos e opções. [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 10/05/2012 - 06:38h

Olá @marcellocaetano , a dica do @/bin/laden parece ser o que vc deseja.

Pense em partes isoladas do problema.

1 - Arquivo de configuração. (Onde irão ficar as infos para a conexão do banco. Variáveis de conexão todas parametrizadas.
2 - Arquivo que faz efetivamente o backup. Pense que você só tem um usuário e um banco de dados. Mostre como seria este caso.
3 - Arquivo contendo os usuários que irão participar dos backups. Pense em uma arquivo de config.
4 - Script efetivo que conecta todos em um único comando de linha passando todos os parâmetros necessários.

Fazendo assim você não vai precisar se preocupar se mudar o acesso ao banco. Altere apenas o script de conexão. Se mudar usuários, altere só o script que vai conter as linhas com os usuários. Se mudar o comando interno de backup como pastas, locais, etc.. mude apenas lá.

Exemplo prático. Tipo 1, tudo vai ser passado ao arquivo.

Arqui conf do mysql

#!/bin/bash
# file: conecta.sh
USER_DB="${1:-"FALHOU_USUARIO_AQUI"}
PASS_DB="${2:-"FALHOU_PASSWORD"}
ENDE_DB="${3:-"FALHOU LOCAL"}
STR_CON="${4:-"FALHOU STRING DE CONEXÃO"}


exemplo 2: Tudo já está dentro do arquivo.


#!/bin/bash
# file: conecta.sh
USER_DB="root"
PASS_DB="suasenha"
ENDE_DB="localhost"
STR_CON="mysql_dump bla bla bla"



A diferença é que no primeiro caso, sempre quando chamar o terceiro script ele vai ter que passar 4 parâmetros todas vez.
No segundo caso, só será feito o include/source do arquivo para que as variáveis sejam valoradas.
Qual é o melhor ? Depende do seu problema. Se tem mais de um banco de dados, a primeira opção é melhor. Se tem apenas um mysql e uma conexão root, a segunda opção é melhor.
Quando você faz acesso root ao banco mysql, vc consegue fazer backup de qualquer banco. O que muda é apenas na query que vai ficar em outro arquivo de configuração.
A escolha é com você.

Agora o config do script que faz efetivamente o backup.
Igual ao exemplo 1, ele deve receber parâmetros. Você pode colocar até 9 sem problemas.
Neste caso não vale a pena a opção 2 do exemplo acima. Geralmente ele vai trabalhar com detalhes sempre divergentes. Não em função da conexão, mas em função do arquivo de configuração de banco de usuários.
É por este motivo que o ideal é você construir este script funcionando muito bem para um caso apenas. Depois que estiver funcionando, vamos trocar todos os locais onde queremos inserir uma rotina parametrizada.

3º arquivo dos usuários e seus bancos e comandos.

Neste arquivo cada linha será um usuário. Dentro de cada linha separado por um delimitador qualquer, pode ser [:], ficará todos os parâmetros de cada user. Caso tenha detalhes diferentes para determinados usuários. Lembrando que neste caso não há necessidade de parâmetros.

4º Arquivo que vai conectar todos os 3 citados onde com uma linha vai fazer o backup de todos. Ele não é necessário. Só serve para provar que tudo vai funcionar bem se você digitar em uma linha apenas. Este arquivo pode fazer todos os backups como pode fazer um apenas. Vai depender dos parâmetros passados dentro dele.

Coloque um script que faça o backup de um banco de forma completa que tentaremos conecta-lo desta forma. Acho que é isso que você precisa.

Não se preocupe com a questão de permissões. É claro que somente o root poderá executar este script. Esse teste é um caso a parte.



6. Re: Argumentos e opções. [RESOLVIDO]

Marcelo Caetano
marcelloinfoweb

(usa elementary OS)

Enviado em 10/05/2012 - 10:43h

Muito Obrigado @AprendiNoLinux pela atenção prestada.

Esta complicado de entender, é uma linguagem nova para mim.

Dúvida: E como fazer para BD em Hosts diferentes?

Aguardo, Obrigado!


7. Re: Argumentos e opções. [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 10/05/2012 - 12:45h

marcellocaetano escreveu:

Muito Obrigado @AprendiNoLinux pela atenção prestada.

Esta complicado de entender, é uma linguagem nova para mim.

Dúvida: E como fazer para BD em Hosts diferentes?

Aguardo, Obrigado!


Perfeito. Para hosts diferentes vamos criar um arquivo de config. Como disse, mande o exemplo de um backup feito como todos os comandos necessários. Não se preocupe, estou aqui para ajuda-lo. Não tenho como simular a sua operação em hosts diferentes, mas acho que consigo fazer um passo a passo se você me der o caminho das pedras que são os comandos na prática para funcionar.

Dividir as configurações em arquivos e colocar o trem pra andar acho que consigo. Lembre-se que a galera aqui do VOL é fera. Sou aprendiz rsrs, mas tem uns caras aí que manjam um bocado.

Faça isso quando puder e me passe as etapas escrevendo cada uma delas que você faria na mão e vamos criando as configurações juntas. Vai perceber que fazendo em pedacinhos fica bem mais fácil.
Veja esta solução deste problema: http://vivaolinux.com.br/topico/Shell-Script/Gerar-arquivo-faltastxt-de-quem-nao-existe-no-arquivo-a...

Este não é o meu script real, mas apenas parte, um pedacinho.


Variáveis públicas.
TMP_DIR="/tmp/trb"
FILE_NAME_ANTES="antes.txt"
FILE_NAME_ATUAL="atual.txt"
FILE_NAME_FALTA="faltas.txt"
FILE_NAME_CANAIS="canais.txt"
PREFIX_FILES="f_canal_"
DIR_CANAIS="/home/gatux/scripts/pasta_virtual/filas"
DIR_TRB="/home/gatux/scripts/pasta_virtual/movimentos"
ARQ_ANTES="${TMP_DIR}/${FILE_NAME_ANTES}"
ARQ_ATUAL="${TMP_DIR}/${FILE_NAME_ATUAL}"
ARQ_FALTA="${TMP_DIR}/${FILE_NAME_FALTA}"
ARQ_CANAIS="${DIR_TRB}/${FILE_NAME_CANAIS}"


O código acima não fica no script, mas em arquivos de configuração. O seu caso vai ser muito similar creio eu. ;)




8. Re: Argumentos e opções. [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 10/05/2012 - 12:54h


Dúvida: E como fazer para BD em Hosts diferentes?


Da mesma forma que você faria na mão. Vamos criar uma tabela de hosts e lá dentro a configuração de cada um deles. Se você consegue acessar seus hosts via linha de comando, vamos conseguir conecta-los no script. Fique sussa ;)



9. Re: Argumentos e opções. [RESOLVIDO]

Marcelo Caetano
marcelloinfoweb

(usa elementary OS)

Enviado em 10/05/2012 - 14:33h

Me desculpe @AprendiNoLinux, mas o que eu pretendo fazer é com argumentos e opções (getopts).

Quero passar uma linha de comando em um script (mysqldump -h host -u user -ppass &db), e quando lido, automaticamente trocar o Use, pass, host e db pela as variáveis no script bkp.sh (citado a cima).

Espero ter sido claro.


10. Re: Argumentos e opções. [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 10/05/2012 - 19:24h

marcellocaetano escreveu:

Me desculpe @AprendiNoLinux, mas o que eu pretendo fazer é com argumentos e opções (getopts).

Quero passar uma linha de comando em um script (mysqldump -h host -u user -ppass &db), e quando lido, automaticamente trocar o Use, pass, host e db pela as variáveis no script bkp.sh (citado a cima).

Espero ter sido claro.


ok, mas o bkp.sh funciona se digitado na mão ? Se sim vamos em frente.


############# ARQUIVO bkp.sh
#################################################
#!/bin/sh

# Linux bin paths, change this if it can't be autodetected via which command
MYSQL="$(which mysql)" # Esta instrução serve apenas para retornar o diretório e nome de onde está instalado o executável.
MYSQLDUMP="$(which mysqldump)" #O mesmo de cima
CHOWN="$(which chown)" #Não sei o motivo.
CHMOD="$(which chmod)" #Não sei o motivo.
GZIP="$(which gzip)" # Retorna algo se gzip instalado.
# Até aqui o script só testou se os progs estão instalados para iniciar o backup. Falta então fazer a rotina que se algum deles falhar, enviar mensagem sobre a falha e abortar.

echo "Fazendo backup do banco de dados, aguarde..."

# Entendi que $DBS deve ser um arquivo ou parâmetro passado ao script. Se for, vou assumir que ele é o 1.

DBS=${1:-"FALHOU DBS"} # Desta forma você deve colocar todos os outros parâmetros na linhas abaixo em ordem, se for o caso, ex:
IGGY=${2:-"NÃO SEI O QUE FAZ"}
MBD=${3:-"VOCE SABE O QUE DEVE SER PASSADO VIA PARÂMETRO"}
etc.. etc.. etc...
# Quando acabar de incluir todos os parâmetros de entrada precisamos testar possíveis falhas antes de iniciar o for.
# Lembrando: Estou confiando que a rotina abaixo esteja funcional. Desconfio que não está.

for db in $DBS
do
skipdb=-1
if [ "$IGGY" != "" ]; then
for i in $IGGY
do
[ "$db" == "$i" ] && skipdb=1 || :
done
fi
if [ "$skipdb" == "-1" ] ; then
FILE="$MBD/$db.$HOST.$NOW.sql.gz"
$MYSQLDUMP --opt -u $MyUSER -p$MyPASS -h $MyHOST $db | $GZIP -9 > $FILE
fi
done




11. Re: Argumentos e opções. [RESOLVIDO]

Marcelo Caetano
marcelloinfoweb

(usa elementary OS)

Enviado em 10/05/2012 - 21:14h

Fiz umas mudanças nos dois scripts, tirei o excesso, se puder me orientar no atual agradeço muito.

Script alterado no início do post.

Obrigado por tudo.


12. Re: Argumentos e opções. [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 11/05/2012 - 12:02h

Deu certo ?



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts