Como verificar se um sistema de arquivos está montado com um script

19

Eu sou novo em scripts ... posso fazer coisas muito básicas, mas agora preciso de uma mão.

Eu tenho um sistema de arquivos local que só será montado quando eu precisar fazer um backup.

Estou começando com isso.

#!/bin/bash
export MOUNT=/myfilesystem

if grep -qs $MOUNT /proc/mounts; then
  echo "It's mounted."
else
  echo "It's not mounted."; then
  mount $MOUNT;
fi

Como eu disse, sou muito básico em scripts. Ouvi dizer que você pode verificar o status do mountcomando observando os códigos de retorno.

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
       8      user interrupt
       16     problems writing or locking /etc/mtab
       32     mount failure
       64     some mount succeeded

Eu não sei como verificar isso. Alguma orientação?

maniat1k
fonte
2
Você tem uma oscilação engraçada ; thenem seu script.
1716
por que estamos exportando o MOUNT var e também removemos o ";"
Mike Q
Perguntas semelhantes estão relacionadas a Falha no servidor , Estouro de pilha e Unix e Linux Stack Exchange .
sasha

Respostas:

19

Você pode verificar o código de status mounte os executáveis ​​mais bem escritos, com o parâmetro especial shell ?.

De man bash:

? Expands to the exit status of the most recently executed foreground pipeline.

Depois de executar o mountcomando, a execução imediata echo $?imprimirá o código de status do comando anterior.

# mount /dev/dvd1 /mnt
  mount: no medium found on /dev/sr0
# echo $?
  32

Nem todos os executáveis ​​possuem códigos de status bem definidos. No mínimo, ele deve sair com um código de sucesso (0) ou falha (1), mas nem sempre é esse o caso.

Para expandir (e corrigir) seu script de exemplo, adicionei uma ifconstrução aninhada para maior clareza. Não é a única maneira de testar o código de status e executar uma ação, mas é a mais fácil de ler ao aprender.

#!/bin/bash
mount="/myfilesystem"

if grep -qs "$mount" /proc/mounts; then
  echo "It's mounted."
else
  echo "It's not mounted."
  mount "$mount"
  if [ $? -eq 0 ]; then
   echo "Mount success!"
  else
   echo "Something went wrong with the mount..."
  fi
fi

Para obter mais informações sobre "Status de saída e saída", consulte o Guia avançado de script de festança .

George M
fonte
1
Não há necessidade de exportar $MOUNT. Este script também será interrompido se o sistema de arquivos tiver algum caractere que sofreria separação de palavras (espaços, etc.). Você deve sempre citar suas expansões.
21712 Chris Down
@ ChrisDown Você está certo. Eu apaguei apenas a óbvia oscilação '; então'. No futuro, fique à vontade para editar minha resposta para torná-la mais correta.
George M
Er ... isso ainda vai quebrar. Você ainda não citou as expansões. Seguindo seu conselho, farei isso agora.
21712 Chris Down
Também não recomendaria criar um link para o famoso guia de scripts "Avançado" do Bash, pois está cheio de erros e ensinará as pessoas a escrever bugs, não scripts. O BashGuide é uma alternativa muito melhor.
21712 Chris Down
2
@ Chrishrown "A divisão de palavras vai comer seus bebês se você não citar as coisas corretamente." Palavras para viver.
George M
35

Muitas distribuições Linux têm o mountpointcomando. Ele pode ser usado explicitamente para verificar se um diretório é um ponto de montagem. Simples assim:

#!/bin/bash    
if mountpoint -q "$1"; then
    echo "$1 is a mountpoint"
else
    echo "$1 is not a mountpoint"
fi
grosshat
fonte
1
Essa abordagem falhará se você tentar verificar um encfs, pois você tropeçará em um erro de permissão negada, quando executado por um usuário não root.
Denys S.
Minha solução funciona com encfs.
Theodore R. Smith
3

Mais uma maneira:

if findmnt ${mount_point}) >/dev/null 2>&1 ; then
  #Do something for positive result (exit 0)
else
  #Do something for negative result (exit 1)
fi
Sol
fonte
Olá @sungtm; parece que você fez login com uma conta nova e separada. Como sua conta "Sun" não possui muita atividade, sugiro que você continue usando sua nova conta "sungtm" , pois isso é mais simples. Se, no entanto, você desejar mesclar as contas, avise-me sinalizando este comentário e entraremos em contato com a equipe do Stack Exchange. Obrigado!
Jeff Schaller
Observe que, para encfs, findmntdeve ser fornecido com o parâmetro --source encfs, caso contrário, ele sempre considerará o diretório a ser montado porque ele retorna à montagem pai.
Burkart
2

A maneira mais fácil que não requer root é:

if $(df | grep -q /mnt/ramdisk); then

fi

ou para ver se não está montado:

if ! $(df | grep -q /mnt/ramdisk); then

fi
Theodore R. Smith
fonte
o mountcomando não precisa de acesso root, dfconcentra-se no espaço em disco e não nos pontos de montagem ...
Philippe Gachoud
1

Declarações breves

Verifique se montado :

mount|grep -q "/mnt/data" && echo "/mnt/data is mounted; I can follow my job!"

Verifica se não está montado :

mount|grep -q "/mnt/data" || echo "/mnt/data is not mounted I could probably mount it!"
Philippe Gachoud
fonte
0

Eu tentei com o script abaixo

#!/bin/bash
echo "enter the file system to check whether its mounted or not"
read p
echo $p
for i in `cat /proc/mounts`
do
if [[ $p =~ $i ]]
then
echo "$p is mounted"
else
echo "$p is not mounted"
fi
done

A única entrada que você precisa fornecer é o nome do sistema de arquivos

Praveen Kumar BS
fonte