shell-script-pt
[Top][All Lists]
Advanced

[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]



reply via email to

[Prev in Thread] Current Thread [Next in Thread]