Dúvida sobre scrit [RESOLVIDO]

1. Dúvida sobre scrit [RESOLVIDO]

Marco Vinycios
marcovinycios

(usa Fedora)

Enviado em 04/06/2013 - 17:55h

Galera tudo bem.

Estou com um problema para resolver que é:

tenho que refazer uma rotina de backup onde um server remoto chama o script local de um servidor1 e este server inicia o backup. Porém como estou começando em shell script, não consigo entender um trecho de código, alguém poderia me ajudar a entender como este código funciona? Este script é o que é acionado remotamente para fazer um backup de banco local.

Segue abaixo.

DATA=`date +%d-%m-%Y`
BKPDIR="/backup/srvarquivos/$DATA"
BKPINFRA="$BKPDIR/INFRA"
BKPQUALIDADE="$BKPDIR/QUALIDADE"
WWW="/var/www/html"
VHOST="/etc/httpd/conf.d"
# ---------------------

# Wiki Qualidade
## Base wiki qualidade

[ -d $BKPQUALIDADE ] || mkdir -p $BKPQUALIDADE ####NÃO ENTENDO ESTA COMPARAÇÃO, PODERIAM AJUDAR

mysqldump -B wikidb -p$PASSWD > /tmp/$04/10/2005_wikidb-qualidade.sql
cd $BKPQUALIDADE
tar cjfv $04/10/2005_wikidb-qualidade.tar.bz2 /tmp/$04/10/2005_wikidb-qualidade.sql
tar cjfv $04/10/2005_wikiwww.tar.bz2 $WWW/w $VHOST/1wiki.conf
rm -f /tmp/$04/10/2005_wikidb-qualidade.sql

# Wiki infra
## Base wiki infraestrutura

[ -d $BKPINFRA ] || mkdir -p $BKPINFRA
mysqldump -B infradb -p$PASSWD > /tmp/$04/10/2005_wiki-infra.sql
cd $BKPINFRA
tar cjfv $04/10/2005_infradb.tar.bz2 /tmp/$04/10/2005_wiki-infra.sql
tar cjfv $04/10/2005_infrawww.tar.bz2 $WWW/infra $VHOST/2infra.conf
rm -f /tmp/$04/10/2005_wiki-infra.sql



  


2. Re: Dúvida sobre scrit [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 04/06/2013 - 20:42h

O shell permite encadear vários comandos numa linha de comando só por meio de cinco diferentes operadores colocados entre tais comandos: ";", "&", "|", "&&" e "||".

";" faz com que os comando sejam executados em sequência. "&", com que sejam executados em paralelo. "|" também faz com que a execução seja simultânea, mas direcionando a saída do comando que estiver à esquerda na entrada do comando que vier à direita (o famoso pipe). "&&" e "||" executam comandos em sequência (como o ";"), mas o comando à direita de "&&" só é executado se o resultado do comando à esquerda tiver sido verdadeiro (código de terminação igual a zero), ao passo que "||" faz exataemnte o oposto, executando o comando à direita se o resultado do comando à esquerda tiver sido falso (código de terminação diferente de zero).

No caso de
[ -d $BKPQUALIDADE ] || mkdir -p $BKPQUALIDADE 

, o que se tem é uma forma (burra) de executar o comando de criação de diretório (à direita) se o diretório não existir (quando o resultado do comando de teste, à esquerda, for falso). É uma forma curta de fazer o equivalente ao seguinte bloco.

if [ -d $BKPQUALIDADE ]; then
mkdir -p $BKPQUALIDADE
fi


E por que eu disse que é burra? Porque a opção "-p" de mkdir serve justamente para dispensar o teste de existência que foi colocando antes do comando. Tal teste faria sentido se tal opção tivesse sido omitida. Mesmo assim, seria ineficiente pois, assim como mdir, [ também é um comando externo; logo seriam necessários dois comandos externos para criar o diretório, quando um seria plenamente suficiente.

Uma solução parecida com a original, ligeiramente mais eficiente (em particular se o diretório já existir), seria substituir o comando externo [ com [[, que é interno ao shell. Obviamente a opção "-p" também poderia ser suprimida de mkdir nesse caso.

[[ -d $BKPQUALIDADE ]] || mkdir $BKPQUALIDADE 



3. Re: Dúvida sobre scrit [RESOLVIDO]

Marco Vinycios
marcovinycios

(usa Fedora)

Enviado em 05/06/2013 - 01:16h

paulo1205 escreveu:

O shell permite encadear vários comandos numa linha de comando só por meio de cinco diferentes operadores colocados entre tais comandos: ";", "&", "|", "&&" e "||".

";" faz com que os comando sejam executados em sequência. "&", com que sejam executados em paralelo. "|" também faz com que a execução seja simultânea, mas direcionando a saída do comando que estiver à esquerda na entrada do comando que vier à direita (o famoso pipe). "&&" e "||" executam comandos em sequência (como o ";"), mas o comando à direita de "&&" só é executado se o resultado do comando à esquerda tiver sido verdadeiro (código de terminação igual a zero), ao passo que "||" faz exataemnte o oposto, executando o comando à direita se o resultado do comando à esquerda tiver sido falso (código de terminação diferente de zero).

No caso de
[ -d $BKPQUALIDADE ] || mkdir -p $BKPQUALIDADE 

, o que se tem é uma forma (burra) de executar o comando de criação de diretório (à direita) se o diretório não existir (quando o resultado do comando de teste, à esquerda, for falso). É uma forma curta de fazer o equivalente ao seguinte bloco.

if [ -d $BKPQUALIDADE ]; then
mkdir -p $BKPQUALIDADE
fi


E por que eu disse que é burra? Porque a opção "-p" de mkdir serve justamente para dispensar o teste de existência que foi colocando antes do comando. Tal teste faria sentido se tal opção tivesse sido omitida. Mesmo assim, seria ineficiente pois, assim como mdir, [ também é um comando externo; logo seriam necessários dois comandos externos para criar o diretório, quando um seria plenamente suficiente.

Uma solução parecida com a original, ligeiramente mais eficiente (em particular se o diretório já existir), seria substituir o comando externo [ com [[, que é interno ao shell. Obviamente a opção "-p" também poderia ser suprimida de mkdir nesse caso.

[[ -d $BKPQUALIDADE ]] || mkdir $BKPQUALIDADE 




Paulo1205 muito obrigado pela resposta, ajudou muito. Porém, sem querer abusar, tenho um script em um servidor que chama este script que executa o backup localmente e depois o servidor central coleta o backup deste server para depois copiar em fita.

Gostaria que no script da máquina cliente (vamos dizer assim), que é este acima, tivesse uma flag para sinalizar ao server de backup quando o backup local tivesse finalizado para poder iniciar a cópia. Tem ideia de como posso fazer isso?

Pensei na possibilidade de criar um arquivo contendo zero e depois que o backup local estivesse terminado, este mesmo arquivo mudasse para 1 para indicar ao server de backup que o arquivo já poderia ser copiado, seria correto fazer isso?



4. Re: Dúvida sobre scrit [RESOLVIDO]

Marco Vinycios
marcovinycios

(usa Fedora)

Enviado em 07/06/2013 - 14:49h

Bom galera agora a dúvida consiste no seguinte:

Gostaria que um script fizesse várias conexões ssh em um loop, lendo um arquivo que tenham vários IP´S. Fiz o script abaixo porém, quando executo dá o erro :

Could not resolve hostname /etc/scripts/teste.txt: Name or service not known

#SEGUE ABAIXO SCRIPT PARA ANÁLISE

echo "Conectando servidor..."
sleep 2

arquivo="/etc/scripts/teste.txt"

for loop in `cat $arquivo | egrep -v "#|^$"`; do
#echo "$loop"

ssh -t [email protected]$arquivo
done

echo "FIM"

Alguém poderia ajudar?


5. Re: Dúvida sobre scrit [RESOLVIDO]

Marco Vinycios
marcovinycios

(usa Fedora)

Enviado em 07/06/2013 - 15:18h

marcovinycios escreveu:

Bom galera agora a dúvida consiste no seguinte:

Gostaria que um script fizesse várias conexões ssh em um loop, lendo um arquivo que tenham vários IP´S. Fiz o script abaixo porém, quando executo dá o erro :

Could not resolve hostname /etc/scripts/teste.txt: Name or service not known

#SEGUE ABAIXO SCRIPT PARA ANÁLISE

echo "Conectando servidor..."
sleep 2

arquivo="/etc/scripts/teste.txt"

for loop in `cat $arquivo | egrep -v "#|^$"`; do
#echo "$loop"

ssh -t [email protected]$arquivo
done

echo "FIM"

Alguém poderia ajudar?


Valeu galera pela ajuda mas o problema foi resolvido. Como?

Na linha do comando ssh, a variável que deveria estar setada era loop e não arquivo.