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.


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.


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.


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"

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

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.

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.


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.


-4

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

alias disk-list="sudo fdisk -l"

żądanie dotyczy skryptu i najlepiej unikać sudo i programu, którego celem jest "manipulowanie partycją dysku"
bcag2
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.