Pertanyaan Apa cara terbaik untuk memeriksa apakah volume dipasang dalam skrip Bash?


Apa cara terbaik untuk memeriksa apakah volume dipasang dalam skrip Bash?

Yang saya inginkan adalah metode yang bisa saya gunakan seperti ini:

if <something is mounted at /mnt/foo> 
then
   <Do some stuff>
else
   <Do some different stuff>
fi

90
2017-08-05 20:16




Saya baru saja akan menulis naskah untuk melakukan ini sendiri. Pikiran pertama saya adalah untuk mendapatkan info dari / etc / mtab Tapi saya belum membolak-balik buku bash saya untuk melihat apakah ada cara yang lebih langsung. - 3dinfluence
@ 3dinfluence - ya saya tahu ini sejak lama, tapi /etc/mtab, /proc/mounts terkait dengan /proc/self/mounts. (minimal pada Fedora 20 itu) - Wilf


Jawaban:


Hindari pemakaian /etc/mtab karena mungkin tidak konsisten.

Hindari pemipaan mount karena itu tidak perlu rumit.

Secara sederhana:

if grep -qs '/mnt/foo ' /proc/mounts; then
    echo "It's mounted."
else
    echo "It's not mounted."
fi

(Ruang setelah /mnt/foo adalah untuk menghindari pencocokan mis. /mnt/foo-bar.)


103
2017-08-05 20:27



Belum lagi, panggilan untuk me-mount bisa bertahan jika mountpoint terjepit. - Chad Huneycutt
Baik untuk linux, bukan untuk freebsd atau solaris. - chris
Ini benar, chris. Meskipun pertanyaan itu ditandai linux. - Dan Carley
Saya kira ini adalah pertanyaan filosofis - haruskah kita berusaha menjadikan barang portabel jika mungkin atau haruskah kita berasumsi bahwa semua windows / linux yang berjalan di dunia dan bertindak sesuai dengan itu? - chris
Sebenarnya, Anda harus menguji '/ mnt / foo', yaitu. dengan spasi atau Anda mungkin mendapatkan false positive jika Anda telah memasang volume bernama misalnya. 'orang bodoh'. Saya baru saja mendapat masalah itu dengan dua mount point, 'lmde' dan 'lmde-home'. - marlar


if mountpoint -q /mnt/foo 
then
   echo "mounted"
else
   echo "not mounted"
fi

atau

mountpoint -q /mnt/foo && echo "mounted" || echo "not mounted"

53
2018-01-04 08:33



Hanya untuk informasi: mountpoint berasal dari paket "initscripts" di Ubuntu / Debian. - blueyed
Tidak bekerja untuk saya - :-( - Wilf
Ini adalah panggilan, bahwa Vagangku tergantung. - dhill
Masalah dengan mountpoint adalah bahwa ia memeriksa, pada kenyataannya, jika titik mount sudah terpasang, tetapi tidak jika perangkat dipasang. Jika suatu perangkat dilewatkan dengan -x pilihan ini memberi tahu Anda nomor perangkat besar / kecil, tetapi tidak jika dipasang. - vegatripy


Skrip seperti ini tidak akan pernah menjadi portabel. Rahasia kotor dalam unix adalah hanya kernel yang tahu filesystem apa di mana, dan kekurangan hal-hal seperti / proc (tidak portabel) tidak akan pernah memberi Anda jawaban langsung.

Saya biasanya menggunakan df untuk menemukan apa yang dimaksud dengan mount-point dari subdirektori, dan filesystem apa yang ada di dalamnya.

Misalnya (membutuhkan shell posix seperti abu / AT & T ksh / bash / dll)

case $(df  $mount)
in
  $(df  /)) echo $mount is not mounted ;;
  *) echo $mount has a non-root filesystem mounted on it ;;
esac

Kinda memberi tahu Anda informasi yang berguna.


6
2017-08-05 20:32



Pertanyaannya adalah menandai linux, jadi mungkin itu tidak harus portabel - Rory


berikut ini yang saya gunakan di salah satu tugas cron-cadangan rsync saya. ia memeriksa apakah / backup sudah di-mount, dan mencoba untuk me-mount-nya jika tidak (mungkin gagal karena drive berada di hot-swap bay dan mungkin tidak ada dalam sistem)

CATATAN: yang berikut hanya berfungsi di linux, karena greps / proc / mounts - versi yang lebih portabel akan menjalankan 'mount | grep / backup ', seperti dalam jawaban Matthew ..

  jika! grep -q / backup / proc / mounts; kemudian
    jika! mount / backup; kemudian
      echo "gagal"
      keluar 1
    fi
  fi
  echo "suceeded."
  # melakukan hal-hal di sini

6
2017-08-05 20:39



Dipilih sebagai alternatif pemeriksaan kesehatan yang baik. - Dan Carley
Agaknya metode ini mengalami masalah yang sama dengan jawaban Matthew Bloch. - mwfearnley
ya, kecuali untuk masalah space-in-filename yang disebutkan oleh "Eliptical view" (ini greps seluruh baris, bukan hanya bidang yang diekstraksi). Masalah sub-string bukanlah masalah besar kecuali Anda lupa bahwa argumen mengutip adalah hal yang dapat Anda lakukan. misalnya grep -q ' /backup ' /proc/mounts atau mount | grep -q ' /backup '. Atau redirect ke / dev / null jika grep Anda tidak mendukung -q (yang aku s di spec POSIX untuk grep hari ini). - cas


findmnt -rno SOURCE,TARGET "$1" menghindari semua masalah dalam jawaban yang lain. Ini bersih melakukan pekerjaan hanya dengan satu perintah.


Pendekatan lain memiliki kelemahan ini:

  • Parsing meningkatRuang putih bermasalah. Ini halaman manual sekarang mengatakan:

.. mode listing dipertahankan hanya untuk kompatibilitas ke belakang.

Untuk penggunaan output yang lebih kuat dan dapat disesuaikan findmnt(8), terutama di skrip Anda.


  • grep -q dan grep -s adalah 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 di nama jalan

Fungsi:

#These functions return exit codes: 0 = found, 1 = not found

isMounted    () { findmnt -rno SOURCE,TARGET "$1" >/dev/null;} #path or device
isDevMounted () { findmnt -rno SOURCE        "$1" >/dev/null;} #device only
isPathMounted() { findmnt -rno        TARGET "$1" >/dev/null;} #path   only

#where: -r = --raw, -n = --noheadings, -o = --output

Contoh penggunaan:

if isPathMounted "/mnt/foo bar";      #Spaces in path names are ok.
   then echo "path is mounted"
   else echo "path is not mounted"
fi

if isDevMounted "/dev/sdb4"; 
   then echo "device is mounted"
   else echo "device is not mounted"
fi

#Universal:
if isMounted "/mnt/foo bar"; 
   then echo "device is mounted"
   else echo "device is not mounted"
fi

if isMounted "/dev/sdb4";
   then echo "device is mounted"
   else echo "device is not mounted"
fi

5
2018-03-15 16:42



Khusus untuk Linux, ini adalah pendekatan terbaik. Saya telah melihat 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 itu tersedia) inilah yang akan saya lakukan. - Pryftan


Karena untuk me-mount, Anda harus memiliki direktori di sana, yang sudah terpasang, strategi saya selalu membuat file palsu dengan nama file yang 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.


2
2017-08-05 20:36





Bagaimana kalau membandingkan nomor perangkat? Saya hanya mencoba untuk memikirkan yang paling esoterik cara..

#!/bin/bash
if [[ $(stat -c "%d" /mnt) -ne $(stat -c "%d" /mnt/foo) ]]; then
    echo "Somethin mounted there I reckon"
fi

Ada kesalahan dalam logika saya dengan itu ...

Sebagai Fungsi:

#!/usr/bin/bash
function somethingMounted {
        mountpoint="$1"
        if ! device1=$(stat -c "%d" $mountpoint); then
                echo "Error on stat of mount point, maybe file doesn't exist?" 1>&2
                return 1
        fi
        if ! device2=$(stat -c "%d" $mountpoint/..); then
                echo "Error on stat one level up from mount point, maybe file doesn't exist?" 1>&2
                return 1
        fi

        if [[ $device1 -ne $device2 ]]; then
                #echo "Somethin mounted there I reckon"
                return 0
        else
                #echo "Nothin mounted it seems"
                return 1
        fi
}

if somethingMounted /tmp; then
        echo "Yup"
fi

Pesan kesalahan echo mungkin berlebihan, karena stat akan menampilkan kesalahan juga.


2
2017-08-05 20:57



Sebenarnya, mungkin harus memeriksa status keluar dari stat pertama untuk setiap panggilan untuk memastikan file itu ada ... bukan sebagai novel seperti yang saya pikirkan :-( - Kyle Brandt♦


Tak satu pun dari ini memenuhi use case di mana direktori yang diberikan adalah sub direktori dalam mount point yang lain. Sebagai contoh, Anda mungkin memiliki / hal yang merupakan mount NFS ke 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 bukanlah titik mount, tetapi / hal sudah terpasang pada host: / real_thing. Jawaban terbaik yang dipilih di sini sebenarnya bukan "cara terbaik untuk menentukan apakah direktori / volumne dipasang". Saya memilih untuk menggunakan 'df -P' (-P mode standar POSIX) sebagai strategi bersih:

dev=`df -P /thing/thingy | awk 'BEGIN {e=1} $NF ~ /^\/.+/ { e=0 ; print $1 ; exit } END { exit e }'` && {
    echo "Mounted via: $dev"
} || {
    echo "Not mounted"
}

Output dari menjalankan ini adalah:

Mounted via: host:/real_thing

Jika Anda ingin tahu apa sebenarnya titik mount, tidak masalah:

mp=`df -P /thing/thingy | awk 'BEGIN {e=1} $NF ~ /^\/.+/ { e=0 ; print $NF ; exit } END { exit e }'` && {
    echo "Mounted on: $mp"
} || {
    echo "Not mounted"
}

Output dari perintah itu adalah:

Mounted on: /thing

Ini semua sangat berguna jika Anda mencoba membuat semacam chroot yang memunculkan titik-titik di luar chroot, di dalam chroot, melalui beberapa direktori acak atau daftar file.


1
2017-10-24 13:59





Maaf karena membahas hal ini tetapi menurut saya ini sangat berguna:

if awk '{print $2}' /proc/mounts | grep -qs "^/backup$"; then
    echo "It's mounted."
else
    echo "It's not mounted."
fi

Ini mendapat kolom ke-2 / proc / mounts (kolom 2 = mount point).

Kemudian ia menyapa output. Perhatikan ^ dan $, ini mencegah / backup dari pencocokan / mnt / backup atau / backup-old dll.


1
2018-03-27 15:59





grep / etc / mtab untuk titik mount Anda mungkin?


0
2017-08-05 20:21



mtab bisa kedaluwarsa atau hanya tidak diperbarui oleh mount, seperti ketika Anda menggunakan mount -n karena / hanya-baca. - chris
Saya setuju, tapi sepertinya itu tempat pertama untuk mulai mencari. - Ophidian