Sprawdź, czy katalog jest zamontowany za pomocą bash

95

ja używam

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

chcę sprawdzić /foo/bar skryptem bash i zobaczyć, czy został zamontowany? Jeśli nie, wywołaj powyższe polecenie montowania, w przeciwnym razie zrób coś innego. Jak mogę to zrobić?

CentOS to system operacyjny.

Justin
źródło
coś w stylu "if [[$ (mount -l ... | fgrep ... | wc -l)]]; then ..."
bobah,
Podobne pytania dotyczą Server Fault , Stack Overflow oraz Unix & Linux Stack Exchange .
Sasha

Odpowiedzi:

69

Uruchomienie mountpolecenia bez argumentów powie ci bieżące montowania. Ze skryptu powłoki możesz sprawdzić punkt montowania za pomocą grepi instrukcji if:

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

W moim przykładzie instrukcja if sprawdza kod zakończenia grep, który wskazuje, czy wystąpiło dopasowanie. Ponieważ nie chcę, aby dane wyjściowe były wyświetlane, gdy istnieje dopasowanie, przekierowuję je do /dev/null.

Christopher Neylan
źródło
4
Nie musisz sprawdzać, czy zwraca ciąg. grepzwraca niezerowy kod zakończenia, jeśli nie ma dopasowań. Nie ma potrzeby testowania ani podpowłoki utworzonej przez $ (). if command | grep -q 'stuff'; then ...
jordanm
32
Nie działa to w przypadku wiązania montowania i dlatego nie powinno być akceptowane jako odpowiedź. Ta odpowiedź powinna zostać odrzucona. Nie możesz polegać na mount | grep ...tym, że pokażesz ci, że twoje powiązanie z wierzchowcem jest nadal aktywne. Jeśli urządzenie bazowe zostanie odmontowane i ponownie zamontowane, powiązanie montowania w rzeczywistości nie będzie już łączyć dwóch plików / katalogów, mimo że mountnadal pokazuje, że jest połączone. A jeśli to zrobisz umount ..., powie ci nawet, że nie jest zamontowany, chociaż mountpowiedział, że tak. OGROMNY błąd w systemie plików Linuksa.
Dev Null
@DevNull: Mam dokładnie ten problem, który opisałeś. Jakieś rozwiązanie tego problemu?
Izaak
@Isaac, przepraszam za opóźnienie w odpowiedzi. Spróbowałbym użyć readlink -f, które nic nie zwraca, gdy ścieżka / plik nie istnieje. Jeśli nie ma bazowego / mount / path / to_file (na readlink), bazowe montowanie jest zepsute (ponownie zamontuj bazowe montowanie i powiązanie). Jeśli podstawowy plik istnieje i readlink -fmówi, że nie ma tam wersji powiązania tego pliku, powiązanie jest zepsute, po prostu podłącz ponownie powiązanie.
Dev Null
2
Jeśli jest /mnt/md0xxxtak zwany montaż , polecenie wskaże /mnt/md0jako zamontowane, podczas gdy to, czego nie musi być ...
David L.
181

Nie zadałeś sobie trudu, aby wspomnieć o O / S.

Ubuntu Linux 11.10 (i prawdopodobnie większość aktualnych wersji Linuksa) ma mountpointpolecenie.

Oto przykład na jednym z moich serwerów:

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

Właściwie w twoim przypadku powinieneś móc skorzystać z tej -qopcji:

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

Mam nadzieję, że to pomoże.

Mark J. Bobak
źródło
7
Czy faktycznie masz coś zamontowanego w czasie wykonywania polecenia „punkt montowania”? Nawet jeśli ma być punktem montowania, chyba że faktycznie coś jest zamontowane, jest to tylko katalog.
Mark J. Bobak
2
+1, działa również na Ubuntu 10.10. Jest w Ubuntu od 8.04 .
l0b0
3
punkt montowania jest również obecny w RHEL 6.3 (prawdopodobnie nawet we wcześniejszych wersjach)
Joril
2
punkt montowania jest obecny i działa również doskonale na Debianie 7 („Wheezy”) i UCS 4
Lahmizzar
7
Jak wspomniano w innym komentarzu, punkt montowania nie działa z montowaniami bind. Fragment będzie wielokrotnie
montował katalog
41

Podręcznik mountpointmówi, że to:

sprawdza, czy podany katalog lub plik jest wymieniony w pliku / proc / self / mountinfo.

Podręcznik mountmówi, że:

Tryb wyświetlania jest utrzymywany tylko w celu zachowania zgodności z poprzednimi wersjami. Aby uzyskać bardziej solidne i konfigurowalne dane wyjściowe, użyj findmnt (8), szczególnie w swoich skryptach.

Tak więc prawidłowe polecenie tofindmnt , które samo jest częścią util-linuxpakietu i zgodnie z instrukcją:

może wyszukiwać w / etc / fstab, / etc / mtab lub / proc / self / mountinfo

Więc w rzeczywistości przeszukuje więcej rzeczy niż mountpoint. Zapewnia również wygodną opcję:

-M, - ścieżka punktu montowania

Jawnie zdefiniuj plik lub katalog punktu podłączenia. Zobacz też --target.

Podsumowując, aby sprawdzić, czy katalog jest zamontowany za pomocą basha, możesz użyć:

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

Przykład:

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.
źródło
2

Lubię odpowiedzi, które używają /proc/mounts, ale nie lubię robić prostego grepa. To może dać fałszywe alarmy. To, co naprawdę chcesz wiedzieć, to „czy którykolwiek z wierszy ma dokładnie ten ciąg dla pola numer 2”. Więc zadaj to pytanie. (w tym przypadku sprawdzam /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
źródło
1
To jest urocze! Dokładnie to, czego chcesz dla małego, wbudowanego systemu, w którym nie ma krzykliwych narzędzi, takich jak mountpointlub findmntistnieją. Bardzo prosta odpowiedź, dużo radości, taki UNIX :)
troglobit
1

Moje rozwiązanie:

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

Przykład:

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

Dla odpowiedzi Marka J. Bobaka , mountpointnie działa, jeśli mount z bindopcją w innym systemie plików.

Dla odpowiedzi Christophera Neylana nie trzeba przekierowywać wyjścia grepa do / dev / null, po prostu użyj grep -qzamiast tego.

Najważniejsze, kanonizuj ścieżkę za pomocąreadlink -f $mypath :

  • Jeśli zaznaczysz ścieżkę, taką jak /path/to/dir/koniec z ukośnikiem odwrotnym, ścieżka wejścia /proc/mountslub mountwyjścia to/path/to/dir
  • W większości wydań Linuksa /var/run/jest dowiązaniem symbolicznym /run/, więc jeśli zamontujesz bind /var/run/mypathi sprawdzisz, czy jest zamontowany, wyświetli się jak /run/mypathw /proc/mounts.
Tanky Woo
źródło
2
Myślę, że "grep -q" $ path "/ proc / mounts" (ze spacją) jest jeszcze lepsze ... W przeciwnym razie is_mount ab zwróci true, jeśli abc jest zamontowane ?!
alfonx
0

Inne czyste rozwiązanie jest takie:

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

Z pewnością wyrażenie „echo coś” można zastąpić tym, co trzeba zrobić dla każdego przypadku.

Hudson Santos
źródło
Robi dokładnie to samo, co odpowiedź @ ChristopherNeylan.
Jonathan H,
0

Odpowiedzi tutaj są zbyt skomplikowane, po prostu sprawdź, czy uchwyt istnieje, używając:

cat /proc/mounts | tail -n 1

Spowoduje to tylko wyprowadzenie ostatniego zamontowanego folderu, jeśli chcesz zobaczyć je wszystkie, po prostu usuń polecenie tail.

Gabriel Fair
źródło
-4

W moim .bashrc utworzyłem następujący alias:

alias disk-list="sudo fdisk -l"
Jordan Effinger
źródło
żądanie dotyczy skryptu i najlepiej unikać sudo i programu, którego celem jest "manipulowanie partycją dysku"
bcag2