Tratar erro mount

1. Tratar erro mount

Edson Marco Ferrari Junior
edmafer

(usa Debian)

Enviado em 14/10/2005 - 10:15h

Olá!

Dando uma olhada no manual do mount eu verifiquei que posso tratar os erros de montagem.

Isto é realmente interessante, pois como vou fazer transferência de arquivos entre máquinas em uma rede, posso ter problemas como a rede, ou com a própria máquina que vai receber, então desta forma devo ser avisado do erro e não tentar dar continuidade ao backup.

O meu problema, é que eu não sei como eu faço para receber o código de retorno do mount.


  


2. Resposta

Edson Marco Ferrari Junior
edmafer

(usa Debian)

Enviado em 14/10/2005 - 13:00h

Pessoal, para futuras pesquisas...

Para você pegar o retorno de um comando no shell (bash), é só você pegar o valor da variável de ambiente $?.


mount -t smbfs -o username=user,password=senha //ip_maquina/dir /mnt/dir
var=$?
echo $var


No exemplo acima ele vai me retornar se houve sucesso ou não na montagem do diretório da rede.

Caso tenha sucesso ele me retorna 0, caso contrário ele me retorna o código do erro (ver man mount, ou o comando desejado).

No meu caso eu usei uma condição para a continuação do script

if [ $var -eq 0 ]
then
//faz o que tem que fazer
else
//diz que deu erro e cai fora
fi

[]'s


3. Realmente interessante!

N
o_lalertom

(usa Slackware)

Enviado em 14/10/2005 - 13:22h

Fiz uns testes e é realmente interessante essa possibilidade de tratamento de erros com comando ``mount''.

Aqui em baixo vai o lista de variáveis que o comando ``mount'' retorna - retirado do "man" do comando ;P

RETURN CODES
mount has the following return codes (the bits can be ORed):

0 success

1 incorrect invocation or permissions

2 system error (out of memory, cannot fork, no more loop devices)

4 internal mount bug or missing nfs support in mount

8 user interrupt

16 problems writing or locking /etc/mtab

32 mount failure

64 some mount succeeded

Olha o teste que fiz:

[email protected]_lalertom:/mnt # mount -t smbfs -o username=user,password=pass //192.168.0.1/pasta /mnt/samba/
[email protected]_lalertom:/mnt # echo $?
0
[email protected]_lalertom:/mnt # umount samba/
[email protected]_lalertom:/mnt # echo $?
0
[email protected]_lalertom:/mnt # umount samba/
umount: samba/: not mounted
[email protected]_lalertom:/mnt # echo $?
1

Valeu pela dica edmafer :D

Nycholas de Oliveira e Oliveira - o_lalertom







4. Mais uma resposta

Edson Marco Ferrari Junior
edmafer

(usa Debian)

Enviado em 14/10/2005 - 13:26h

Nycholas, eu recebi uma resposta do pessoal do Rau-Tu da Unicamp.

Achei interessante postar para futuras pesquisas...

A primeira eu já havia feito e não funcionou, mas as outras ainda não testei.

respondida por narumi em 14/10/2005 12:41
Olá Marco,

Existem alguns meios. O mais trivial:
msg=`mount /ponto_de_montagem argumentos`;
Depois verificar o conteúdo de $msg.

Método 2
Basta uma pequena verificação:
if [ ! -z "$(mount |grep "/ponto_de_montagem)" ]; then
echo "já está montado!"
else
mount /ponto_de_montagem
fi

Método 3
Você poderia dar um ls no /ponto_de_montagem e verificar
se ele retorna algum arquivo, ou ainda poderia contar
a quantidade de linhas do ls.

[]s,

http://www.rau-tu.unicamp.br/linguagens/read.php?tid=8&qid=5159&key=

[]'s


5. Re: Tratar erro mount

Perfil removido
removido

(usa Nenhuma)

Enviado em 14/10/2005 - 14:04h

Essa técnica :

mount -t smbfs -o username=user,password=senha //ip_maquina/dir /mnt/dir
var=$?
echo $var # Status da operação anterior

é válida para qualquer comando.

sabe quando fazemos algo como

cd ~/backup && cp ~/.bashrc ./bashrc

seria o mesmo que fazer

cd ~/backup
STAT=$?

if [ $? == 0 ]; then
cp ~/.bashrc ./bashrc
exit 0
else
echo "Não consegui entrar em ~/backup"
exit 1
fi

Isso reflete em uma "boa educação" : usar exit 0 para quando o script termina certinho e exit 1 para quando ele termina com erro.
Assim, se alguém for fazer alguma coisa do tipo

./meu_script && echo "terminamos" || echo "erro"

as respostas vão estar correlacionadas com a realidade e não com o acaso.

Observe no meu exemplo, se tivessemos feito apenas :

#!/bin/bash
cd ~/backup
cp ~/.bashrc ./bashrc


e depois fizemos uma chamada de status do script ele SEMPRE terminaria ok, por que ? Porque mesmo que ele não entre no diretório ~/backup ele ainda seria capaz de fazer a cópia pedida... é claro que esse exemplo é besta, mas é bem educativo. Devemos sempre nos policiar para colocar exit com status, assim teremos sempre a certeza de que tipo de finalização teremos...

também vale quando não colocamos, pois nesse caso, queremos que o STATUS seja sempre o status do último comando, mesmo que os anteriores não tenham sido bem sucedidos, exemplo onde isso é verdade :

#!/bin/bash
cp ~/.bashrc ~/backup/bashrc

Não é necessário dizer o status, afinal o status do script, é o status do último comando, como temos apenas um comando não é necessário colocar o exit 1 ou exit 0, ainda sim, colocaríamos algo como :

#!/bin/bash
cp ~/.bashrc ~/backup/bashrc
STAT=$?
[ $? == 0 ] && { exit 0; } || { exit 1; }

ou então :

#!/bin/bash
cp ~/.bashrc ~/backup/bashrc
exit $?

Dizem os especialista que é sempre recomendado validar o status, mas eu mesmo não sou um bom exemplo...


6. Re: Tratar erro mount

Tiago Barcellos Peczenyj
pacman

(usa Ubuntu)

Enviado em 25/10/2005 - 00:05h

mount /o/que/vc/quer && echo "montou" || echo "nao montou, q saco..."