Qual é a melhor maneira de verificar se um volume está montado em um script Bash?
O que eu realmente gostaria é de um método que eu possa usar assim:
if <something is mounted at /mnt/foo>
then
<Do some stuff>
else
<Do some different stuff>
fi
Evite usar
/etc/mtab
porque pode ser inconsistente.Evite a tubulação
mount
porque não precisa ser tão complicado.Simplesmente:
(O espaço após o
/mnt/foo
é para evitar correspondência, por exemplo/mnt/foo-bar
.)ou
findmnt -rno SOURCE,TARGET "$1"
evita todos os problemas nas outras respostas. Ele faz o trabalho de forma limpa com apenas um comando.Outras abordagens têm essas desvantagens:
grep -q
egrep -s
são um passo extra desnecessário e não são suportados em todos os lugares./proc/\*
não é suportado em todos os lugares. (mountpoint
também é baseado em proc).mountinfo
é baseado em /proc/..cut -f3 -d' '
bagunça espaços em nomes de caminhoFunções do Bash:
#Exemplos de uso:
Um script como esse nunca será portátil. Um segredo sujo no unix é que apenas o kernel sabe onde estão os sistemas de arquivos e, a não ser por coisas como /proc (não portátil), nunca lhe dará uma resposta direta.
Eu normalmente uso df para descobrir qual é o ponto de montagem de um subdiretório e em qual sistema de arquivos ele está.
Por exemplo (requer shell posix como ash / AT&T ksh / bash / etc)
Kinda diz-lhe informações úteis.
o seguinte é o que eu uso em um dos meus cron-jobs de backup rsync. ele verifica se /backup está montado e tenta montá-lo se não estiver (pode falhar porque a unidade está em um compartimento hot-swap e pode nem estar presente no sistema)
NOTA: o seguinte só funciona no linux, porque greps /proc/mounts - uma versão mais portátil executaria 'mount | grep /backup', como na resposta de Matthew ..
Como para montar, você precisa ter um diretório lá de qualquer maneira, que seja montado, minha estratégia sempre foi criar um arquivo falso com um nome de arquivo estranho que nunca seria usado, e apenas verificar sua existência. Se o arquivo estava lá, então nada foi montado naquele local...
Eu não acho que isso funcione para montar unidades de rede ou coisas assim. Usei para pendrives.
Que tal comparar números de dispositivos? Eu estava apenas tentando pensar da maneira mais esotérica ..
Há uma falha na minha lógica com isso ...
Como uma função:
As mensagens de erro de eco provavelmente são redundantes, porque o stat também exibirá um erro.
Este script verificará se a unidade está montada e realmente disponível. Pode ser escrito de forma mais compacta, mas prefiro que seja simples assim, pois não estou familiarizado com o Bash. Você pode querer alterar o tempo limite, ele está definido para 10 seg. no roteiro.
Eu gosto das respostas que usam
/proc/mounts
, mas não gosto de fazer um simples grep. Isso pode lhe dar falsos positivos. O que você realmente quer saber é "qualquer uma das linhas tem essa string exata para o campo número 2". Então, faça essa pergunta. (neste caso estou verificando/opt
)Nenhum deles satisfaz o caso de uso em que um determinado diretório é um subdiretório dentro de outro ponto de montagem. Por exemplo, você pode ter /thing que é uma montagem NFS para hospedar:/real_thing. Usar grep para este propósito em /proc/mounts /etc/mtab ou 'mount' não funcionará, porque você estará procurando por um ponto de montagem que não existe. Por exemplo, /thing/thingy não é um ponto de montagem, mas /thing é montado em host:/real_thing. A melhor resposta votada aqui NÃO é, na verdade, "a melhor maneira de determinar se um diretório/volume está montado". Eu votaria a favor usando 'df -P' (modo de padrões -P POSIX) como uma estratégia mais limpa:
A saída da execução disso será:
Se você quiser saber qual é o ponto de montagem real, não há problema:
A saída desse comando será:
Isso tudo é muito útil se você estiver tentando criar algum tipo de chroot que espelhe pontos de montagem fora do chroot, dentro do chroot, por meio de algum diretório ou lista de arquivos arbitrária.