[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Re:[shell-script] criar um arquivo com o log das instalaçoes
From: |
MrBiTs |
Subject: |
Re: Re:[shell-script] criar um arquivo com o log das instalaçoes |
Date: |
Thu, 14 Jul 2005 07:41:10 -0300 |
/*
entao emerson e todo pessoal .... é +/- isso q eu precisava sim , mas acontece
q aqui , nesse caso po ex, seu tenho o script abaixo:
mkdir teste
mkdir teste
tar zxvf teste.tar.gz
depois eu checo o log e ele so mostra os arquivos extraidos pelo "tar" , mas
nao mostra as linhas de comandos . enquanto ta sendo o tar",beleza, sabemos q é
referente a descompactaçao mas e se é dos mkdir ,chmod, como vamos saber o erro?
seria legal se o LOG apresentasse a linha decomando , e a sua saida no caso,
isso é possivel?
*/
Não pergunte se é possível. Pergunte COMO fazer :)
Eu consigo imaginar uma dúzia de jeitos.
- Verbose de comandos
Praticamente TODOS os comandos possuem um modo de verbose, que emite as
mensagens de sucesso ou erro dos comandos, bem como outras informações úteis
para debug de aplicações. Senão vejamos, utilizando um exemplo seu. O primeiro
passo é verificar se o comando em questão possui uma opção de verbose:
$ mkdir --help
Usage: mkdir [OPTION] DIRECTORY...
Create the DIRECTORY(ies), if they do not already exist.
Mandatory arguments to long options are mandatory for short options too.
-m, --mode=MODE set permission mode (as in chmod), not rwxrwxrwx - umask
-p, --parents no error if existing, make parent directories as needed
-v, --verbose print a message for each created directory
--help display this help and exit
--version output version information and exit
Opa ! -v ou --verbose. Então vamos fazer:
$ mkdir -v teste
mkdir: cannot create directory `teste': File exists
$ mkdir -vvv teste2
mkdir: created directory `teste2'
Aí está: uma mensagem de erro e uma mensagem de sucesso.
Isso tudo irá para o seu log. Ainda é possivel brincarmos com algo como colocar
a data e hora da execução do comando, emitindo echos como:
[MrBiTs@gatinha MrBiTs]$ echo -n "[$(date +%d/%m/%Y\ %H:%M:%S)] " && mkdir -v
teste2
[14/07/2005 07:14:25] mkdir: cannot create directory `teste2': File exists
Você pode extrapolar tudo isso e inserir uma variavel $DEBUG em sua aplicação
e, caso o seu script seja execuatado com uma opção -v ( por exemplo), voce
configuraria DEBUG="-v" e, uma vez que você já tem em todos os comandos uma
chamada como:
mkdir $DEBUG teste
chmod $DEBUG 777 teste
uma vez o modo debug ativado, você teria em seu log principal todas as
mensagens de todos os comandos.
- set -x
set -x é uma opção interessante já que mostrará a linha de comando antes de sua
execução. Então, imaginando o nosso script, teremos:
$ cat d.sh
#!/bin/bash
set -x
mkdir -v teste
chmod -v 777 teste
$ ./d.sh
+ mkdir -v teste
mkdir: cannot create directory `teste': File exists
+ chmod -v 777 teste
mode of `teste' changed to 0777 (rwxrwxrwx)
- Funções de tratamento de erro
TODO e QUALQUER COMANDO executado em shell vai ter o seu código de retorno
armazenado em uma variável especial chamada $?, que pode ser utilizada em
testes. No nosso exemplo:
$ mkdir -v teste
mkdir: cannot create directory `teste': File exists
$ echo $?
1
$ chmod -v 777 teste
mode of `teste' changed to 0777 (rwxrwxrwx)
$ echo $?
0
Vimos aí que um retorno 0 significa sucesso, enquanto um retorno DIFERENTE de
zero significa erro. Podemos então extrapolar nosso script para fazer algo como:
$ cat d.sh
#!/bin/bash
set -x
mkdir -v teste
if [ $? -gt 0 ] ; then
echo "Erro na criação do Diretório teste"
exit
fi
chmod -v 777 teste
E executando-o:
$ ./d.sh
+ mkdir -v teste
mkdir: cannot create directory `teste': File exists
+ [ 1 -gt 0 ]
+ echo Erro na criação do Diretório teste
Erro na criação do Diretório teste
+ exit
Veja que interessante. Como definimos que a não criação de um diretório é um
erro crítico, abortamos a aplicação e NÃO EXECUTAMOS o chmod.
Uma modificação do script seria:
$ cat d.sh
#!/bin/bash
set -x
if ! mkdir -v teste ; then
echo "Erro na criação do Diretório teste"
exit
fi
chmod -v 777 teste
Executando-o:
$ ./d.sh
+ mkdir -v teste
mkdir: cannot create directory `teste': File exists
+ echo Erro na criação do Diretório teste
Erro na criação do Diretório teste
+ exit
Mesmo conceito e erros que o script anterior, mas agora não testamos a variavel
$? explicitamente e sim executamos diretamente o comando dentro da condição if.
Acho que a partir daí você já tem condições de escrever códigos com bastante
mensagens e depurações e, até mesmo, criar uma biblioteca de funções só para
depuração de erros. Eu tenho a minha :).
Uma dica que dou a todos os meus alunos é que acessem os diretórios /bin e
/usr/bin e executem cada um dos comandos com a opção --help, pelo menos para
conhecer as opções que cada ferramenta disponível no sistema tem. Como isso é
um trabalho chato, faça isso pelo menos com os comandos que você vai usar em
seu script, obviamente entendendo o que cada parametro faz. Desde que você não
esteja executando tudo como root, os riscos de você danificar seu sistema são
bem pequenos.
[As partes desta mensagem que não continham texto foram removidas]