Apa cara terbaik untuk memeriksa apakah volume sudah dipasang di skrip Bash?
Apa yang benar-benar saya sukai adalah metode yang dapat saya gunakan seperti ini:
if <something is mounted at /mnt/foo>
then
<Do some stuff>
else
<Do some different stuff>
fi
/etc/mtab
,/proc/mounts
terkait dengan/proc/self/mounts
. (minimal pada Fedora 20 itu)Jawaban:
Hindari penggunaan
/etc/mtab
karena mungkin tidak konsisten.Hindari perpipaan
mount
karena tidak perlu yang rumit.Secara sederhana:
(Ruang setelah
/mnt/foo
adalah untuk menghindari pencocokan misalnya/mnt/foo-bar
.)sumber
atau
sumber
mountpoint
berasal dari paket "skrip init" di Ubuntu / Debian.mountpoint
itu memeriksa, pada kenyataannya, jika titik mount sudah terpasang, tetapi tidak jika perangkat sudah terpasang. Jika suatu perangkat disahkan dengan-x
opsi itu memberitahu Anda nomor perangkat utama / minor, tetapi tidak jika itu dipasang.util-linux
findmnt -rno SOURCE,TARGET "$1"
menghindari semua masalah dalam jawaban lainnya. Itu bersih melakukan pekerjaan hanya dengan satu perintah.Pendekatan lain memiliki kelemahan ini:
grep -q
dangrep -s
merupakan langkah ekstra yang tidak perlu dan tidak didukung di mana-mana./proc/\*
tidak didukung di mana-mana.mountinfo
didasarkan pada / proc / ..cut -f3 -d' '
mengacaukan spasi dalam nama jalurFungsi bash:
Contoh penggunaan:
sumber
findmnt(8)
perintah tetapi saya tidak pernah benar-benar bermain dengannya. Terus terang jika saya memperbarui beberapa skrip saya yang melakukan hal semacam ini (atau membuat yang baru) pada kotak Linux (atau di mana perintah tersedia) inilah yang akan saya lakukan.findmnt
harus disertakan dengan parameter--source encfs
, jika tidak akan selalu mempertimbangkan direktori untuk dipasang karena jatuh kembali ke mount induk.grep
solusinya karena jika path mount aneh, Anda bisa mendapatkan false positive: misalnya jika saya mount/dev/mmcblk0p1
on~/mnt/dev/sda1
, saya bisa salah melakukan hal yang di/dev/sda1
-mount oleh perintahmount | grep '/dev/sda1'
. Saya tidak bisa mendapatkan hasil positif palsufindmnt
. Jawaban yang bagus!Skrip seperti ini tidak akan portabel. Rahasia kotor di unix adalah bahwa hanya kernel yang tahu sistem file mana, dan kekurangan / proc (tidak portabel) itu tidak akan pernah memberi Anda jawaban langsung.
Saya biasanya menggunakan df untuk menemukan apa mount-point dari subdirektori, dan filesystem apa yang ada di dalamnya.
Misalnya (memerlukan shell posix seperti ash / AT&T ksh / bash / dll)
Agak memberitahu Anda informasi yang berguna.
sumber
berikut ini adalah apa yang saya gunakan di salah satu cs-job backup rsync saya. ia memeriksa untuk melihat apakah / backup sudah di-mount, dan mencoba untuk memasangnya jika tidak (mungkin gagal karena drive berada dalam ruang hot-swap dan bahkan mungkin tidak ada dalam sistem)
CATATAN: yang berikut ini hanya berfungsi di linux, karena greps / proc / mounts - versi yang lebih portabel akan menjalankan 'mount | grep / backup ', seperti pada jawaban Matthew ..
sumber
grep -q ' /backup ' /proc/mounts
ataumount | grep -q ' /backup '
. Atau redirect ke / dev / null jika grep Anda tidak mendukung-q
(yang ada dalam spesifikasi POSIX untuk grep hari ini).Karena untuk me-mount, Anda harus memiliki direktori di sana, yang akan dipasang, strategi saya adalah selalu membuat file palsu dengan nama file aneh yang tidak akan pernah digunakan, dan hanya memeriksa keberadaannya. Jika file itu ada di sana, maka tidak ada yang dipasang di tempat itu ...
Saya tidak berpikir ini berfungsi untuk memasang drive jaringan atau hal-hal seperti itu. Saya menggunakannya untuk flash drive.
sumber
Bagaimana dengan membandingkan nomor perangkat? Saya hanya mencoba memikirkan cara yang paling esoteris ..
Ada cacat dalam logika saya dengan itu ...
Sebagai fungsi:
Pesan kesalahan gema mungkin berlebihan, karena stat akan menampilkan kesalahan juga.
sumber
Tak satu pun dari ini memenuhi use case di mana direktori yang diberikan adalah sub direktori dalam mount point lain. Sebagai contoh, Anda mungkin memiliki / hal yang merupakan mount NFS untuk di-host: / real_thing. Menggunakan grep untuk tujuan ini di / proc / mounts / etc / mtab atau 'mount' tidak akan berfungsi, karena Anda akan mencari titik mount yang tidak ada. Sebagai contoh, / thing / thingy bukan mount point, tapi / thing di-mount pada host: / real_thing. Jawaban terbaik yang dipilih di sini sebenarnya BUKAN "cara terbaik untuk menentukan apakah direktori / volumne dipasang". Saya akan memilih menggunakan 'df -P' (-P mode standar POSIX) sebagai strategi yang lebih bersih:
Output dari menjalankan ini adalah:
Jika Anda ingin tahu apa sebenarnya mount point, tidak masalah:
Output dari perintah itu adalah:
Ini semua sangat berguna jika Anda mencoba membuat semacam chroot yang mencerminkan titik mount di luar chroot, di dalam chroot, melalui beberapa direktori atau daftar file yang sewenang-wenang.
sumber
Maaf karena mengemukakan ini tetapi saya pikir ini cukup berguna:
Ini mendapatkan kolom ke-2 dari / proc / mounts (kolom ke-2 = mount points).
Kemudian ia menangkap output. Catat ^ dan $, ini mencegah / backup dari pencocokan / mnt / backup atau / backup lama dll.
sumber
grep / etc / mtab untuk titik mount Anda mungkin?
sumber
Ini?:
Dari: Forum Ubuntu
sumber
Meskipun ini adalah pertanyaan Linux, mengapa tidak membuatnya portabel ketika mudah dilakukan?
Halaman manual
grep
mengatakan:Jadi saya mengusulkan solusi berikut:
sumber
-q
dan-s
ditentukan oleh POSIX sehingga tidak boleh ada masalah portabilitas dengan itu pula (jika tidak sebelum - aku sudah tidak terus melacak perubahan apa yang terjadi ketika).Apakah perlu lebih rumit dari ini?
sumber
grep -q /mnt/foo
juga akan cocok dengan poin pemasangan/mnt/food
dan/not/mnt/foo
... Bagaimanagrep -qx /mnt/foo
?-x
membuat pertandingan grep hanya jika seluruh baris cocok.cut -f 3 -d ' '
tersandung ketika mount path memiliki spasi dalam nama file.Tergantung apa yang Anda ketahui tentang volume yang Anda periksa.
Dalam kasus khusus yang saya teliti baru-baru ini, di mana saya prihatin untuk menemukan apakah flash drive tertentu dipasang, yang paling mudah adalah memeriksa keberadaan / dev / disk / oleh-label /. Jika perangkat dicolokkan, skrip udev pastikan tautannya ada (dan dihapus saat perangkat dicabut).
(Ini BUKAN jawaban yang sangat portabel; itu bekerja pada banyak distribusi Linux modern, dan pertanyaannya ditandai untuk Linux, dan ini merupakan pendekatan yang sangat berbeda dari apa pun yang disebutkan sejauh ini sehingga memperluas kemungkinan.)
sumber
Buat file di bawah mountpoint Anda seperti
check_mount
dan kemudian coba apakah itu ada?sumber
Saya harus melakukan ini di Chef untuk idempotensi karena ketika chef-client akan berjalan, run akan gagal karena volume yang sudah terpasang. Pada saat saya menulis ini,
mount
sumber daya Chef memiliki beberapa jenis bug yang tidak akan berfungsi dengan atribut seperti yang saya butuhkan, jadi saya memasang volume menggunakanexecute
sumber daya sebagai gantinya. Begini cara saya melakukannya:Dalam hal terjadi kebingungan, dalam file atribut saya, saya memiliki yang berikut:
Ini
if not node['docker-server']['mountpoint'] == "none"
adalah bagian daricase
pernyataan di mana jika titik mount di server tidak ditentukan, titik mount default kenone
.sumber