Dizinin bash ile bağlanıp bağlanmadığını kontrol edin


95

Ben kullanıyorum

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

/foo/barBir bash betiği ile kontrol etmek ve takılı olup olmadığını görmek istiyorum. Değilse, yukarıdaki bağlama komutunu çağırın, başka bir şey yapın. Bunu nasıl yapabilirim?

CentOS, işletim sistemidir.


"if [[$ (mount -l ... | fgrep ... | wc -l)]]; sonra ..." gibi bir şey
bobah

Benzer sorular Sunucu Hatası , Yığın Taşması ve Unix ve Linux Yığın Değişimi üzerinedir .
Sasha

Yanıtlar:


71

mountKomutu bağımsız değişkenler olmadan çalıştırmak size mevcut bağlantıları söyleyecektir. Bir kabuk betiğinden bağlama noktasını grepve bir if-ifadesiyle kontrol edebilirsiniz:

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

Örneğimde, if-ifadesi grepbir eşleşme olup olmadığını gösteren çıkış kodunu kontrol ediyor . Bir eşleşme olduğunda çıktının görüntülenmesini istemediğim için, onu yönlendiriyorum /dev/null.


4
Bir dizge döndürüp döndürmediğini kontrol etmenize gerek yok. grepeşleşme yoksa sıfır olmayan bir çıkış durumu döndürür. Teste veya $ () tarafından oluşturulan alt kabuğa gerek yoktur. if command | grep -q 'stuff'; then ...
jordanm

32
Bu, mount bind ile çalışmaz ve bu nedenle yanıt olarak kabul edilmemelidir. Bu cevap oylanmalıdır. Bağlantınızın mount | grep ...hala aktif olduğunu size göstermeye güvenemezsiniz . Temel aygıtın bağlantısı kesilir ve yeniden bağlanırsa, bağlanma bağlantısı mounthala bağlı olduğunu göstermesine rağmen artık iki dosya / dizini bağlamayacaktır. Ve yaparsanız umount ..., monte edilmediğini bile söyleyecektir, ancak mountsöylendiği halde. Linux dosya sisteminde BÜYÜK kusur.
Dev Boş

@DevNull: Tam olarak anlattığınız sorunu yaşıyorum. Bu soruna herhangi bir çözüm var mı?
Isaac

@Isaac, yanıttaki gecikme için özür dilerim. readlink -fYol / dosya olmadığında hiçbir şey döndürmeyen kullanmayı deneyeceğim . Temel / mount / path / to_file yoksa (okuma bağlantısı başına), temeldeki bağlama bozulur (temeldeki bağlama ve bağlamayı yeniden bağlama). Temel dosya oradaysa ve readlink -fo dosyanın ciltleme sürümünün orada olmadığını söylüyorsa, bağlama bozulur, yalnızca bağlamayı yeniden bağlayın.
Dev Null

2
Adında bir binek varsa /mnt/md0xxx, komut /mnt/md0takılı olarak gösterecek, ne olması gerekmediğini gösterecektir ...
David L.

184

O / S'den bahsetmeye zahmet etmedin.

Ubuntu Linux 11.10 (ve muhtemelen Linux'un en güncel sürümleri) mountpointkomuta sahip.

İşte sunucularımdan birinde bir örnek:

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

Aslında, sizin durumunuzda -q, aşağıdaki gibi seçeneği kullanabilmelisiniz :

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

Umarım yardımcı olur.


7
Aslında 'mountpoint' komutunu çalıştırdığınızda monte edilmiş bir şey var mı? Bir bağlama noktası olması amaçlansa bile, aslında monte edilmiş bir şey olmadığı sürece , bu sadece bir dizindir.
Mark J. Bobak

2
+1, Ubuntu 10.10'da da çalışıyor. 8.04'ten beri Ubuntu'da .
l0b0

3
mountpoint, RHEL 6.3'te de mevcut (muhtemelen daha önceki sürümlerde bile)
Joril

2
mountpoint mevcut ve Debian 7 ("Wheezy") ve UCS 4'te de mükemmel çalışıyor
Lahmizzar

7
Bahsedildiği gibi başka açıklama bağlantı noktasının değil bağlama kaidesi bulunan çalışır. Snippet, dizini birden çok kez
bağlayacak

42

El kitabı şunu mountpointsöylüyor:

verilen dizin veya dosyadan / proc / self / mountinfo dosyasında bahsedilip bahsedilmediğini kontrol eder.

El kitabı şunu mountsöylüyor:

Listeleme modu yalnızca geriye dönük uyumluluk için korunur. Daha sağlam ve özelleştirilebilir çıktı için, özellikle betiklerinizde findmnt (8) kullanın.

Dolayısıyla , kullanılacak doğru komutfindmnt , kendisi util-linuxpaketin bir parçası olan ve kılavuza göre şudur :

/ etc / fstab, / etc / mtab veya / proc / self / mountinfo içinde arama yapabilir

Yani aslında daha fazla şey arıyor mountpoint. Ayrıca uygun seçeneği de sağlar:

-M, --mountpoint yolu

Bağlama noktası dosyasını veya dizini açıkça tanımlayın. Ayrıca bkz. --Target.

Özet olarak, bir dizinin bash ile bağlanıp bağlanmadığını kontrol etmek için şunları kullanabilirsiniz:

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

Misal:

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

Kullanılan cevapları seviyorum /proc/mounts, ancak basit bir grep yapmayı sevmiyorum. Bu size yanlış pozitifler verebilir. Ne gerçekten bilmek istiyorum "satırların herhangi birini alan 2 numaralı bu dizeyi var" dır. Öyleyse, bu soruyu sorun. (bu durumda kontrol ediyorum /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
Bu çok güzel! Hiçbir gösterişli aracın olmadığı mountpointveya olmadığı küçük bir gömülü sistem için tam olarak istediğiniz şey findmnt. Çok basit cevap, çok sevinç, böyle UNIX :)
troglobit

1

Çözümüm:

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

Misal:

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

For Mark J. Bobak cevabı , mountpointbirlikte monte eğer çalışmaz bindfarklı dosya sistemindeki seçeneği.

İçin Christopher Neylan cevabı , / dev / null, sadece kullanmak üzere yönlendirme grep en çıkışına ihtiyaç değil grep -qbunun yerine.

En önemlisi, yolu aşağıdakileri kullanarak standartlaştırınreadlink -f $mypath :

  • /path/to/dir/Ters eğik çizgiyle son gibi bir yolu kontrol ederseniz , giriş /proc/mountsveya mountçıkış/path/to/dir
  • En linux açıklamasında, /var/run/bir sembolik bağdır /run/için bağlama monte eğer öyleyse, /var/run/mypathve onu monte eğer o kadar gösterecektir kontrol /run/mypathiçinde /proc/mounts.

2
Bence "grep -q" $ yol "/ proc / mounts" (boşluklu) daha da iyi ... Aksi takdirde is_mount ab, abc monte edilirse doğru döndürür ?!
alfonx

0

Başka bir temiz çözüm ise şudur:

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

Elbette, 'bir şeyi yankıla' her durum için yapmanız gereken şeyle değiştirilebilir.


Bu, @ ChristopherNeylan'ın cevabıyla tamamen aynı şeyi yapıyor.
Jonathan H

0

Buradaki cevaplar çok karmaşık, sadece bağlantının var olup olmadığını kontrol edin:

cat /proc/mounts | tail -n 1

Bu, yalnızca son bağlanan klasörün çıktısını verir, eğer hepsini görmek istiyorsanız, sadece kuyruk komutunu kaldırın.


-4

.Bashrc dosyamda aşağıdaki takma adı yaptım:

alias disk-list="sudo fdisk -l"

istek komut dosyası ile ilgili ve en iyisi
sudo'dan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.