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
/etc/mtab
,/proc/mounts
estão ligados a/proc/self/mounts
. (pelo menos no Fedora 20) #Respostas:
Evite usar,
/etc/mtab
pois pode ser inconsistente.Evite tubulações,
mount
porque não precisa ser tão complicado.Simplesmente:
(O espaço após o
/mnt/foo
é evitar correspondência, por exemplo/mnt/foo-bar
.)fonte
ou
fonte
mountpoint
origina-se no pacote "initscripts" no Ubuntu / Debian.mountpoint
é que ele verifica, de fato, se um ponto de montagem está montado, mas não se um dispositivo está montado. Se um dispositivo for aprovado com a-x
opção, ele informará o número do dispositivo principal / secundário, mas não se ele estiver montado.util-linux
findmnt -rno SOURCE,TARGET "$1"
evita todos os problemas nas outras respostas. Ele limpa o trabalho com apenas um comando.Outras abordagens têm as seguintes desvantagens:
grep -q
egrep -s
são uma etapa extra desnecessária e não são suportadas em todos os lugares./proc/\*
não é suportado em qualquer lugar.mountinfo
é baseado em / proc / ..cut -f3 -d' '
bagunça espaços nos nomes dos caminhosFunções do Bash:
Exemplos de uso:
fonte
findmnt(8)
comando, mas nunca brinquei com ele. Francamente, se eu atualizasse alguns dos meus scripts que fazem esse tipo de coisa (ou fazem novos) em uma caixa Linux (ou onde o comando está disponível), é isso que eu faria.findmnt
deve 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.grep
solução, porque se um caminho de montagem é estranho, você pode obter falsos positivos: por exemplo, se eu montar/dev/mmcblk0p1
em~/mnt/dev/sda1
, eu poderia incorretamente coisa que/dev/sda1
é montado pelo comandomount | grep '/dev/sda1'
. Não consigo obter um falso positivo usandofindmnt
. Boa resposta!Um script como esse nem sempre será portátil. Um segredo sujo no unix é que apenas o kernel sabe quais são os sistemas de arquivos e, além de coisas como / proc (não portável), nunca fornecerá uma resposta direta.
Normalmente, uso o df para descobrir qual é o ponto de montagem de um subdiretório e em que sistema de arquivos ele está.
Por exemplo (requer shell posix como ash / AT&T ksh / bash / etc)
Meio que lhe informa informações úteis.
fonte
a seguir é 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 de troca a quente e pode até não estar presente no sistema)
NOTA: o seguinte funciona apenas no linux, porque greps / proc / mounts - uma versão mais portátil executaria 'mount | grep / backup ', como na resposta de Matthew ..
fonte
grep -q ' /backup ' /proc/mounts
oumount | grep -q ' /backup '
. Ou redirecione para / dev / null se o seu grep não suportar-q
(que está na especificação POSIX para grep atualmente).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á, nada foi montado naquele local ...
Eu não acho que isso funcione para montar unidades de rede ou coisas assim. Eu usei para drives flash.
fonte
Que tal comparar números de dispositivos? Eu só estava 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á o erro.
fonte
Nenhuma delas 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 / coisa que é uma montagem NFS para hospedar: / real_thing. Usar grep para esse fim em / proc / mounts / etc / mtab ou 'mount' não funcionará, porque você estará procurando um ponto de montagem que não existe. Por exemplo, / thing / thingy não é um ponto de montagem, mas / thing está montado no host: / real_thing. A melhor resposta votada aqui NÃO é "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ê deseja saber qual é o verdadeiro ponto de montagem, não há problema:
A saída desse comando será:
Tudo isso é 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 um diretório ou lista de arquivos arbitrários.
fonte
Desculpe por trazer isso à tona, mas acho que isso é bastante útil:
Isso obtém a segunda coluna de / proc / mounts (segunda coluna = pontos de montagem).
Então ele recebe a saída. Observe ^ e $, isso impede / backup de corresponder / mnt / backup ou / backup-old etc.
fonte
grep / etc / mtab para o seu ponto de montagem, talvez?
fonte
Este?:
De: Um fórum do Ubuntu
fonte
Embora essa seja uma pergunta sobre o Linux, por que não torná-lo portátil quando é fácil?
A página do manual
grep
diz:Então, proponho a seguinte solução:
fonte
-q
e-s
são especificados pelo POSIX então não deve haver qualquer problema de portabilidade com ele de qualquer maneira (agora, se não antes - Eu não tenho mantido a par de que mudanças acontecem quando).Precisa ser mais complicado que isso?
fonte
grep -q /mnt/foo
também combinará pontos de montagem/mnt/food
e/not/mnt/foo
... Que talgrep -qx /mnt/foo
?-x
faz grep corresponder apenas se a linha inteira corresponder.cut -f 3 -d ' '
tropeça quando o caminho de montagem tem um espaço em um nome de arquivo.Depende do que você sabe sobre o volume que está verificando.
No caso específico que pesquisei recentemente, em que estava preocupado em descobrir se uma unidade flash específica foi montada, o que funciona mais facilmente é verificar a existência de / dev / disks / by-label /. Se o dispositivo estiver conectado, os scripts do udev garantem que o link exista (e que ele seja removido quando o dispositivo estiver desconectado).
(Essa NÃO é uma resposta altamente portátil; funciona em muitas distribuições modernas do Linux, e a pergunta foi marcada para Linux, e é uma abordagem completamente diferente de qualquer coisa mencionada até agora, para expandir as possibilidades.)
fonte
Crie um arquivo sob o seu ponto de montagem
check_mount
e teste apenas se ele existe?fonte
Eu tive que fazer isso no Chef por idempotência, já que quando o chef-client seria executado, a execução falharia devido ao volume já estar montado. No momento em que escrevo isso, o
mount
recurso Chef possui algum tipo de erro que não funcionaria com os atributos da maneira que eu precisava, então montei o volume usando oexecute
recurso. Aqui está como eu fiz isso:Em caso de confusão, no meu arquivo de atributos, tenho o seguinte:
Isso
if not node['docker-server']['mountpoint'] == "none"
faz parte de umacase
instrução em que, se o ponto de montagem no servidor não for especificado, o ponto de montagem será o padrãonone
.fonte