Montar e desmontar no mesmo script de shell resulta em erro

5

Eu preciso montar um volume, tar do conteúdo do volume montado e desmontar esse volume montado, em um único script de shell.

Então codifiquei como

$ cat sample.sh
sudo mount -o loop Sample.iso /tmp/mnt
cd /tmp/mnt
tar-cvf /tmp/sample.tar *
sudo umount /tmp/mnt

Eu recebi o erro umount: /tmp/mnt: device is busy.

Então eu verifiquei o

$ lsof /tmp/mnt

Produz o atual arquivo "sh". Então eu me convenci, /tmp/mnt está ocupado no script atual (neste caso, sample.sh).

Existe alguma maneira de contornar (montar, tar, desmontar) no mesmo script?

P.S : posso desmontar o volume / tmp / mnt assim que o script terminar.

    
por Kumar 20.01.2017 / 14:45

2 respostas

15

Você precisa sair do diretório para desmontá-lo, assim:

#!/bin/bash
sudo mount -o loop Sample.iso /tmp/mnt
cd /tmp/mnt
tar -cvf /tmp/sample.tar *
#Got to the old working directory. **NOTE**: OLDPWD is set automatically.
cd $OLDPWD
#Now we're able to unmount it. 
sudo umount /tmp/mnt

É isso.

    
por 20.01.2017 / 14:55
11

O dispositivo está "ocupado", já que você usou cd para entrar nele. Você não pode desmontar a partição do diretório de trabalho atual (de qualquer processo, neste caso o shell).

Seu script:

sudo mount -o loop Sample.iso /tmp/mnt
cd /tmp/mnt
tar -cvf /tmp/sample.tar *
sudo umount /tmp/mnt

Script modificado sem o mesmo problema:

sudo mount -o loop Sample.iso /tmp/mnt
( cd /tmp/mnt && tar -cvf /tmp/sample.tar * )
sudo umount /tmp/mnt

Como o cd acontece em um sub-shell, ele não afetará o ambiente fora dele, e o diretório atual no momento do umount estará onde você estava quando executou o script.

Esta é uma construção de shell muito comum, ou seja, para fazer

( cd dir && somecommand )

É muito mais limpo (e mais claro) do que tentar cd em algum lugar e depois voltar novamente, especialmente ao ter que entrar em vários diretórios durante o curso de um script.

Com o && também significa que o comando não será executado se o cd falhar por algum motivo. Em seu script, se o mount falhasse, você ainda criaria um tar archive de um diretório vazio (?), Por exemplo, que pode não ser o que você deseja.

Uma variante mais curta que faz uso do sinal -C de tar :

sudo mount -o loop Sample.iso /tmp/mnt
tar -cvf /tmp/sample.tar -C /tmp/mnt .
sudo umount /tmp/mnt

Isso faz com que tar faça o cd internamente antes de adicionar o diretório atual ( /tmp/mnt ) ao arquivo. Observe, porém, que isso tem o efeito de que arquivos ou pastas ocultos também serão adicionados ao arquivo.

    
por 20.01.2017 / 14:56