Jaki jest najlepszy sposób sprawdzenia, czy wolumin jest zamontowany w skrypcie Bash?
To, co naprawdę lubię, to metoda, której mogę użyć w następujący sposób:
if <something is mounted at /mnt/foo>
then
<Do some stuff>
else
<Do some different stuff>
fi
/etc/mtab
,/proc/mounts
są powiązane/proc/self/mounts
. (przynajmniej na Fedorze 20)Odpowiedzi:
Unikaj używania,
/etc/mtab
ponieważ może być niespójne.Unikaj instalacji rurowej,
mount
ponieważ nie musi to być tak skomplikowane.Po prostu:
(Przestrzeń po
/mnt/foo
jest, aby uniknąć dopasowania np/mnt/foo-bar
.)źródło
lub
źródło
mountpoint
pochodzi z pakietu „initscripts” w Ubuntu / Debian.mountpoint
polega na tym, że w rzeczywistości sprawdza, czy punkt montowania jest zamontowany, ale nie czy urządzenie jest zamontowane. Jeśli urządzenie zostanie przekazane z-x
opcją, poda numer główny / podrzędny, ale nie, jeśli zostanie zamontowane.util-linux
findmnt -rno SOURCE,TARGET "$1"
pozwala uniknąć wszystkich problemów zawartych w innych odpowiedziach. Czyści to dobrze za pomocą jednego polecenia.Inne podejścia mają te wady:
grep -q
igrep -s
są dodatkowym niepotrzebnym krokiem i nie są obsługiwane wszędzie./proc/\*
nie jest obsługiwany wszędzie.mountinfo
jest oparty na / proc / ..cut -f3 -d' '
miesza spacje w nazwach ścieżekFunkcje Bash:
Przykłady użycia:
źródło
findmnt(8)
polecenie, ale tak naprawdę nigdy się nim nie bawiłem. Szczerze mówiąc, gdybym miał zaktualizować niektóre moje skrypty, które robią tego typu rzeczy (lub tworzyć nowe) na Linux-ie (lub tam, gdzie dostępna jest komenda), to właśnie bym to zrobił.findmnt
musi być dostarczony z parametrem--source encfs
, w przeciwnym razie zawsze będzie rozważał katalog do zamontowania, ponieważ wraca do montowania nadrzędnego.grep
rozwiązanie, ponieważ jeśli ścieżka podłączenia jest dziwne, można uzyskać fałszywych alarmów: np gdybym zamontować/dev/mmcblk0p1
na~/mnt/dev/sda1
mogłem błędnie rzeczą, która/dev/sda1
jest zamontowana za pomocą poleceniamount | grep '/dev/sda1'
. Nie mogę uzyskać fałszywie pozytywnego wynikufindmnt
. Dobra odpowiedź!Taki skrypt nigdy nie będzie przenośny. Brudnym sekretem w Uniksie jest to, że tylko jądro wie, gdzie są systemy plików, a poza takimi rzeczami jak / proc (nieprzenośny) nigdy nie da ci prostej odpowiedzi.
Zazwyczaj używam df, aby dowiedzieć się, jaki jest punkt montowania podkatalogu i w jakim systemie plików on jest.
Na przykład (wymaga powłoki posix, takiej jak ash / AT&T ksh / bash / etc)
Trochę mówi ci przydatne informacje.
źródło
Oto, czego używam w jednym z moich zadań CRON do tworzenia kopii zapasowych rsync. sprawdza, czy / backup jest zamontowany i próbuje go zamontować, jeśli nie jest (może się nie powieść, ponieważ dysk znajduje się we wnęce typu hot-swap i może nawet nie być obecny w systemie)
UWAGA: poniższe działa tylko w systemie Linux, ponieważ greps / proc / mounts - w bardziej przenośnej wersji można uruchomić polecenie „mount | grep / backup ”, jak w odpowiedzi Matthew ..
źródło
grep -q ' /backup ' /proc/mounts
lubmount | grep -q ' /backup '
. Lub przekieruj do / dev / null, jeśli twój grep nie obsługuje-q
(który jest obecnie w specyfikacji POSIX dla grep).Ponieważ aby zamontować, musisz mieć tam katalog, który się zamontuje, moją strategią było zawsze tworzenie fałszywego pliku z dziwną nazwą pliku, który nigdy nie byłby używany, i po prostu sprawdzanie jego istnienia. Jeśli plik tam był, to nic nie zostało zamontowane w tym miejscu ...
Nie sądzę, że to działa do montowania dysków sieciowych lub podobnych rzeczy. Użyłem go do dysków flash.
źródło
Co powiesz na porównanie numerów urządzeń? Chciałem tylko wymyślić najbardziej ezoteryczny sposób ...
Z moją logiką jest wada ...
Jako funkcja:
Komunikaty o błędach echa są prawdopodobnie zbędne, ponieważ stat wyświetli również błąd.
źródło
Żaden z nich nie spełnia przypadku użycia, w którym dany katalog jest podkatalogiem w innym punkcie podłączenia. Na przykład możesz mieć / thing, który jest podłączeniem NFS do hosta: / real_thing. Użycie grep w tym celu na / proc / mounts / etc / mtab lub 'mount' nie będzie działać, ponieważ będziesz szukał punktu montowania, który nie istnieje. Na przykład / rzecz / rzecz nie jest punktem montowania, ale / rzecz jest zamontowane na hoście: / real_thing. Najlepsza odpowiedź tutaj głosowana NIE jest „najlepszym sposobem na ustalenie, czy katalog / wolumen jest zamontowany”. Głosowałbym za użyciem „df -P” (tryb standardów -P POSIX) jako czystszej strategii:
Wynikiem uruchomienia będzie:
Jeśli chcesz wiedzieć, jaki jest prawdziwy punkt montowania, nie ma problemu:
Dane wyjściowe tego polecenia będą następujące:
Jest to bardzo przydatne, jeśli próbujesz utworzyć pewnego rodzaju chroot, który odzwierciedla punkty montowania poza chroot, wewnątrz chroot, za pośrednictwem dowolnego katalogu lub listy plików.
źródło
Przepraszam, że o tym wspomniałem, ale myślę, że jest to całkiem przydatne:
Otrzymuje drugą kolumnę / proc / mounts (druga kolumna = punkty montowania).
Następnie grepuje dane wyjściowe. Uwaga ^ i $, zapobiega to dopasowaniu / backup do / mnt / backup lub / backup-old itp.
źródło
może grep / etc / mtab dla twojego punktu montowania?
źródło
To?:
Od: Forum Ubuntu
źródło
Chociaż jest to pytanie dotyczące systemu Linux, dlaczego nie uczynić go przenośnym, gdy można go łatwo wykonać?
Strona podręcznika
grep
mówi:Proponuję więc następujące rozwiązanie:
źródło
-q
i-s
są określone przez POSIX, więc nie powinno być żadnego problemu z tym i tak przenośność (obecnie jeśli nie przed - I już nie śledził, co zmienia się, gdy).Czy to musi być bardziej skomplikowane?
źródło
grep -q /mnt/foo
będą również pasować do punktów montowania/mnt/food
i/not/mnt/foo
... Co powiesz nagrep -qx /mnt/foo
?-x
dopasowuje grep tylko wtedy, gdy pasuje cała linia.cut -f 3 -d ' '
potknie się, gdy ścieżka montowania ma spację w nazwie pliku.Zależy od tego, co wiesz o woluminie, którego szukasz.
W konkretnym przypadku, który ostatnio badałem, w którym martwiłem się, czy konkretny dysk flash został zamontowany, najłatwiej działa sprawdzenie istnienia / dev / disks / by-label /. Jeśli urządzenie jest podłączone, skrypty udev upewniają się, że link istnieje (i że jest usuwany, gdy urządzenie jest odłączone).
(To NIE jest bardzo przenośna odpowiedź; działa jednak na wiele współczesnych dystrybucji Linuksa, a pytanie zostało oznaczone dla Linuksa i jest to zupełnie inne podejście niż wszystko, co do tej pory wspomniano, więc rozszerza możliwości.)
źródło
Utwórz plik pod swoim punktem montowania,
check_mount
a następnie po prostu przetestuj, czy istnieje?źródło
Musiałem to zrobić w Chef dla idempotencji, ponieważ kiedy szef kuchni-klient działał, bieg nie udawał się z powodu już zamontowanego woluminu. W chwili, gdy to piszę,
mount
zasób szefa kuchni ma jakiś błąd, który nie działałby z atrybutami tak, jak potrzebowałem, więcexecute
zamiast tego zamontowałem wolumin za pomocą tego zasobu. Oto jak to zrobiłem:W przypadku jakichkolwiek nieporozumień w moim pliku atrybutów mam:
if not node['docker-server']['mountpoint'] == "none"
Jest częściącase
rachunku gdzie jeśli punkt instalacji na serwerze nie jest określony, punkt montowania do domyślnychnone
.źródło