Periksa apakah direktori dipasang dengan bash

94

saya menggunakan

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

Saya ingin memeriksa /foo/barmeskipun dengan skrip bash, dan melihat apakah sudah dipasang? Jika tidak, panggil perintah mount di atas, jika tidak lakukan sesuatu yang lain. Bagaimana saya bisa melakukan ini?

CentOS adalah sistem operasinya.

Justin
sumber
sesuatu seperti "if [[$ (mount -l ... | fgrep ... | wc -l)]]; kemudian ..."
bobah
Pertanyaan serupa ada di Server Fault , Stack Overflow dan Unix & Linux Stack Exchange .
Sasha

Jawaban:

69

Menjalankan mountperintah tanpa argumen akan memberi tahu Anda pemasangan saat ini. Dari skrip shell, Anda dapat memeriksa titik pemasangan dengan grepdan pernyataan if:

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

Dalam contoh saya, pernyataan-if memeriksa kode keluar dari grep, yang menunjukkan jika ada kecocokan. Karena saya tidak ingin output ditampilkan ketika ada kecocokan, saya mengarahkannya ke /dev/null.

Christopher Neylan
sumber
4
Anda tidak perlu memeriksa apakah itu mengembalikan string. grepmengembalikan status keluar bukan nol jika tidak ada kecocokan. Tidak perlu pengujian, atau subkulit dibuat oleh $ (). if command | grep -q 'stuff'; then ...
jordanm
32
Ini tidak berfungsi dengan mount bind dan oleh karena itu tidak boleh diterima sebagai jawabannya. Jawaban ini harus ditolak. Anda tidak bisa bergantung untuk mount | grep ...menunjukkan bahwa mount bind Anda masih aktif. Jika perangkat yang mendasari dilepas dan dipasang kembali, ikatan pemasangan sebenarnya tidak akan lagi menghubungkan dua file / direktori meskipun mountmasih menunjukkan itu terhubung. Dan jika Anda melakukannya umount ...bahkan akan memberi tahu Anda itu tidak dipasang, meskipun mountdikatakan itu. Cacat BESAR dalam sistem file linux.
Dev Null
@DevNull: Saya mengalami masalah yang persis seperti yang Anda jelaskan. Ada solusi untuk masalah ini?
Ishak
@Isaac, maaf atas keterlambatan tanggapan. Saya akan mencoba menggunakan readlink -f, yang tidak mengembalikan apa-apa ketika path / file tidak ada. Jika yang mendasari / mount / path / to_file tidak ada (per readlink), mount yang mendasari rusak (pasang kembali mount dan binding yang mendasarinya). Jika file yang mendasarinya ada di sana dan readlink -fmengatakan bahwa versi pengikatan dari file itu tidak ada, pengikatan rusak, cukup pasang ulang pengikatan.
Dev Null
2
Jika ada mount yang dipanggil /mnt/md0xxxmaka perintah akan menunjukkan /mnt/md0mount sementara apa yang tidak harus ...
David L.
179

Anda tidak perlu repot-repot menyebutkan O / S.

Ubuntu Linux 11.10 (dan mungkin Linux yang paling mutakhir) memiliki mountpointperintah.

Berikut contoh di salah satu server saya:

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

Sebenarnya, dalam kasus Anda, Anda harus dapat menggunakan -qopsi, seperti ini:

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

Semoga membantu.

Mark J. Bobak
sumber
7
Anda sebenarnya memiliki sesuatu yang dipasang pada saat Anda menjalankan perintah 'mountpoint'? Bahkan jika itu dimaksudkan sebagai mountpoint, kecuali jika itu benar - benar memiliki sesuatu yang terpasang, itu hanya sebuah direktori.
Mark J. Bobak
2
+1, juga berfungsi di Ubuntu 10.10. Sudah ada di Ubuntu sejak 8.04 .
l0b0
3
mountpoint juga hadir di RHEL 6.3 (mungkin bahkan di versi sebelumnya)
Joril
2
mountpoint hadir dan berfungsi di Debian 7 ("Wheezy") dan UCS 4 juga dengan sempurna
Lahmizzar
7
Seperti yang disebutkan di mountpoint komentar lain tidak berfungsi dengan bind mount. Cuplikan akan memasang dir beberapa kali
csanchez
41

Manual mountpointmengatakan bahwa:

memeriksa apakah direktori atau file yang diberikan disebutkan dalam file / proc / self / mountinfo.

Manual mountmengatakan bahwa:

Mode daftar dipertahankan hanya untuk kompatibilitas ke belakang. Untuk hasil yang lebih kuat dan dapat disesuaikan, gunakan findmnt (8), terutama dalam skrip Anda.

Jadi perintah yang benar untuk digunakan adalahfindmnt , yang merupakan bagian dari util-linuxpaket itu sendiri dan, menurut manual:

dapat mencari di / etc / fstab, / etc / mtab atau / proc / self / mountinfo

Jadi sebenarnya ini mencari lebih banyak hal daripada mountpoint. Ini juga menyediakan opsi yang nyaman:

-M, jalur --mountpoint

Definisikan file atau direktori mountpoint secara eksplisit. Lihat juga --target.

Singkatnya, untuk memeriksa apakah sebuah direktori dipasang dengan bash, Anda dapat menggunakan:

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

Contoh:

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.
sumber
2

Saya suka jawaban yang digunakan /proc/mounts, tetapi saya tidak suka melakukan grep sederhana. Itu bisa memberi Anda hasil positif palsu. Apa yang benar - benar ingin Anda ketahui adalah "apakah salah satu baris memiliki string yang sama persis untuk bidang nomor 2". Jadi, tanyakan pertanyaan itu. (dalam hal ini saya sedang memeriksa /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
sumber
1
Ini bagus! Tepatnya apa yang Anda inginkan untuk sistem tertanam kecil di mana tidak ada alat mencolok seperti mountpointatau findmntada. Balasan yang sangat sederhana, banyak kegembiraan, UNIX seperti itu :)
troglobit
1

Solusi saya:

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

Contoh:

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

Untuk jawaban Mark J. Bobak , mountpointtidak berfungsi jika mount dengan bindopsi di filesystem berbeda.

Untuk jawaban Christopher Neylan , tidak perlu mengalihkan keluaran grep ke / dev / null, cukup gunakan grep -q.

Yang paling penting, kanonikalisasi jalur dengan menggunakanreadlink -f $mypath :

  • Jika Anda memeriksa jalur seperti /path/to/dir/diakhiri dengan garis miring terbalik, jalur masuk /proc/mountsatau mountkeluaran adalah/path/to/dir
  • Di kebanyakan rilis linux, /var/run/adalah symlink dari /run/, jadi jika Anda memasang bind /var/run/mypathdan memeriksa apakah sudah terpasang, itu akan ditampilkan seperti /run/mypathpada /proc/mounts.
Tanky Woo
sumber
2
Saya pikir "grep -q" $ path "/ proc / mounts" (dengan spasi) bahkan lebih baik ... Jika tidak, is_mount ab akan mengembalikan nilai true jika abc di-mount ?!
alfonx
0

Solusi bersih lainnya adalah seperti itu:

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

Yang pasti, 'gema sesuatu' dapat diganti dengan apa pun yang perlu Anda lakukan untuk setiap kasus.

Hudson Santos
sumber
Ini melakukan hal yang persis sama dengan jawaban @ ChristopherNeylan.
Jonathan H
0

Jawaban di sini terlalu rumit, cukup periksa apakah mount ada menggunakan:

cat /proc/mounts | tail -n 1

Ini hanya mengeluarkan folder yang terakhir dipasang, jika Anda ingin melihat semuanya, hapus saja perintah tail.

Gabriel Fair
sumber
-4

Di .bashrc saya, saya membuat alias berikut:

alias disk-list="sudo fdisk -l"
Jordan Effinger
sumber
permintaannya adalah tentang skrip dan yang terbaik adalah menghindari sudo dan program yang targetnya adalah "memanipulasi partisi disk"
bcag2