Verifique se o diretório está montado com o bash

94

estou usando

mount -o bind /some/directory/here /foo/bar

Quero verificar /foo/barcom um script bash e ver se ele foi montado. Se não, chame o comando de montagem acima, senão faça outra coisa. Como posso fazer isso?

CentOS é o sistema operacional.

Justin
fonte
algo como "if [[$ (mount -l ... | fgrep ... | wc -l)]]; then ..."
bobah
Perguntas semelhantes estão em Server Fault , Stack Overflow e Unix e Linux Stack Exchange .
Sasha

Respostas:

70

Executar o mountcomando sem argumentos informará as montagens atuais. Em um script de shell, você pode verificar o ponto de montagem com grepuma instrução if:

if mount | grep /mnt/md0 > /dev/null; then
    echo "yay"
else
    echo "nay"
fi

No meu exemplo, a instrução if está verificando o código de saída de grep, que indica se houve uma correspondência. Como não quero que a saída seja exibida quando houver uma correspondência, estou redirecionando para /dev/null.

Christopher Neylan
fonte
4
Você não precisa verificar se ele retorna uma string. grepretorna um status de saída diferente de zero se não houver correspondências. Não há necessidade do teste ou do subshell criado por $ (). if command | grep -q 'stuff'; then ...
Jordânia
31
Isso não funciona com o mount bind e, portanto, não deve ser aceito como a resposta. Esta resposta deve ser rejeitada. Você não pode depender de mount | grep ...mostrar a você que seu vínculo de montagem ainda está ativo. Se o dispositivo subjacente for desmontado e remontado, o bind de montagem não conectará mais os dois arquivos / diretórios, embora mountainda mostre que está conectado. E se você fizer umount ...isso vai mesmo dizer que não está montado, embora mountdisse que estava. Grande falha no sistema de arquivos do Linux.
Dev Null
@DevNull: Estou tendo exatamente o problema que você descreveu. Alguma solução para este problema?
Isaac
@Isaac, desculpe a demora na resposta. Eu tentaria usar readlink -f, que não retorna nada quando o caminho / arquivo não existe. Se o / mount / path / to_file subjacente não estiver lá (por link de leitura), a montagem subjacente está quebrada (remonte a montagem subjacente e a vinculação). Se o arquivo subjacente estiver lá e readlink -fdisser que a versão de vinculação desse arquivo não está lá, a vinculação foi interrompida, basta remontar a vinculação.
Dev Null
2
Se houver uma montagem chamada /mnt/md0xxxassim, o comando indicará /mnt/md0como montado enquanto o que não precisa ser ...
David L.
178

Você não se preocupou em mencionar um O / S.

Ubuntu Linux 11.10 (e provavelmente as versões mais atualizadas do Linux) têm o mountpointcomando.

Aqui está um exemplo em um de meus servidores:

$ mountpoint /oracle
/oracle is a mountpoint
$ mountpoint /bin
/bin is not a mountpoint

Na verdade, no seu caso, você deve ser capaz de usar a -qopção, assim:

mountpoint -q /foo/bar || mount -o bind /some/directory/here /foo/bar

Espero que ajude.

Mark J. Bobak
fonte
7
Você realmente tem algo montado no momento em que executou o comando 'mountpoint'? Mesmo que seja um ponto de montagem, a menos que realmente tenha algo montado, é apenas um diretório.
Mark J. Bobak
2
+1, funciona no Ubuntu 10.10 também. Está no Ubuntu desde 8.04 .
10b0
3
O ponto de montagem também está presente no RHEL 6.3 (provavelmente até em versões anteriores)
Joril
2
mountpoint está presente e funciona no Debian 7 ("Wheezy") e UCS 4 perfeitamente, também
Lahmizzar
7
Conforme mencionado em outro comentário, o ponto de montagem não funciona com montagens de ligação. O snippet montará o dir várias vezes
csanchez
40

O manual do mountpointdiz que:

verifica se o diretório ou arquivo fornecido é mencionado no arquivo / proc / self / mountinfo.

O manual do mountdiz que:

O modo de listagem é mantido apenas para compatibilidade com versões anteriores. Para uma saída mais robusta e personalizável, use findmnt (8), especialmente em seus scripts.

Portanto, o comando correto a ser utilizado éfindmnt , ele próprio parte do util-linuxpacote e, de acordo com o manual:

é capaz de pesquisar em / etc / fstab, / etc / mtab ou / proc / self / mountinfo

Portanto, ele realmente pesquisa mais coisas do que mountpoint. Ele também oferece a opção conveniente:

-M, --mountpoint path

Defina explicitamente o arquivo ou diretório do ponto de montagem. Veja também --target.

Em resumo, para verificar se um diretório está montado com bash, você pode usar:

if [[ $(findmnt -M "$FOLDER") ]]; then
    echo "Mounted"
else
    echo "Not mounted"
fi

Exemplo:

mkdir -p /tmp/foo/{a,b}
cd /tmp/foo

sudo mount -o bind a b
touch a/file
ls b/ # should show file
rm -f b/file
ls a/ # should show nothing

[[ $(findmnt -M b) ]] && echo "Mounted"
sudo umount b
[[ $(findmnt -M b) ]] || echo "Unmounted"
Jonathan H
fonte
2

Eu gosto das respostas que usam /proc/mounts, mas não gosto de fazer um grep simples. Isso pode gerar falsos positivos. O que você realmente quer saber é "alguma das linhas tem esta string exata para o campo número 2". Então, faça essa pergunta. (neste caso, estou verificando /opt)

awk -v status=1 '$2 == "/opt" {status=0} END {exit status}' /proc/mounts

# and you can use it in and if like so:

if awk -v status=1 '$2 == "/opt" {status=0} END {exit status}' /proc/mounts; then
  echo "yes"
else
  echo "no"
fi
Bruno Bronosky
fonte
1
Isso é adorável! Exatamente o que você deseja para um pequeno sistema embarcado onde nenhuma ferramenta chamativa gosta mountpointou findmntexiste. Resposta muito simples, muita alegria, como UNIX :)
troglobit
1

Minha solução:

is_mount() {
    path=$(readlink -f $1)
    grep -q "$path" /proc/mounts
}

Exemplo:

is_mount /path/to/var/run/mydir/ || mount --bind /var/run/mydir/ /path/to/var/run/mydir/

Para a resposta de Mark J. Bobak , mountpointnão funciona se montar com bindopção em sistema de arquivos diferente.

Para a resposta de Christopher Neylan , não é necessário redirecionar a saída do grep para / dev / null, apenas use grep -q.

O mais importante, canonize o caminho usandoreadlink -f $mypath :

  • Se você verificar o caminho como /path/to/dir/terminar com barra invertida, o caminho de entrada /proc/mountsou mountsaída é/path/to/dir
  • Na maioria das versões do Linux, /var/run/é o link simbólico de /run/, portanto, se você montar o bind for /var/run/mypathe verificar se ele foi montado, ele será exibido como /run/mypathem /proc/mounts.
Tanky Woo
fonte
2
Acho que "grep -q" $ path "/ proc / mounts" (com espaço) é ainda melhor ... Caso contrário, is_mount ab retornará true se abc for montado ?!
alfonx
0

Outra solução limpa é assim:

$ mount | grep /dev/sdb1 > /dev/null && echo mounted || echo unmounted

Com certeza, 'echo something' pode ser substituído por qualquer coisa que você precise fazer para cada caso.

Hudson Santos
fonte
Isso está fazendo exatamente a mesma coisa que a resposta de @ChristopherNeylan.
Jonathan H
0

As respostas aqui são muito complicadas, basta verificar se a montagem existe usando:

cat /proc/mounts | tail -n 1

Isso gera apenas a última pasta montada, se você quiser ver todas elas, basta remover o comando tail.

Gabriel Fair
fonte
-4

No meu .bashrc, criei o seguinte alias:

alias disk-list="sudo fdisk -l"
Jordan Effinger
fonte
a solicitação é sobre o script e é melhor evitar sudo e programa cujo objetivo é "manipular a partição do disco"
bcag2