GNU/Linux >> Belajar Linux >  >> Linux

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

Solusi 1:

Hindari penggunaan /etc/mtab karena mungkin tidak konsisten.

Hindari pemipetan mount karena tidak perlu terlalu rumit.

Cukup:

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

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

Solusi 2:

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

atau

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

Solusi 3:

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

Pendekatan lain memiliki kelemahan berikut:

  • grep -q dan grep -s adalah langkah tambahan yang tidak perlu dan tidak didukung di semua tempat.
  • /proc/\* tidak didukung di mana-mana. (mountpoint juga berdasarkan proc).
  • mountinfo didasarkan pada /proc/..
  • cut -f3 -d' ' mengacaukan spasi dalam nama jalur
  • Mengurai pemasangan ruang putih bermasalah. Halaman manualnya sekarang mengatakan:

.. mode daftar dipertahankan hanya untuk kompatibilitas mundur.

Untuk keluaran yang lebih kuat dan dapat disesuaikan, gunakan findmnt (8), terutama dalam skrip Anda.

Fungsi Bash:

#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

Solusi 4:

Skrip seperti ini tidak akan pernah portabel. Rahasia kotor di unix adalah bahwa hanya kernel yang tahu di mana filesystem berada, dan singkatnya seperti /proc (tidak portabel) itu tidak akan pernah memberi Anda jawaban langsung.

Saya biasanya menggunakan df untuk menemukan titik-mount dari subdirektori, dan di sistem file apa subdirektori itu berada.

Misalnya (memerlukan posix shell seperti ash / AT&T ksh / bash / etc)

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

Agak memberi tahu Anda informasi yang berguna.

Solusi 5:

berikut ini adalah apa yang saya gunakan di salah satu cron-job cadangan rsync saya. memeriksa untuk melihat apakah /backup sudah terpasang, dan mencoba memasangnya jika tidak (mungkin gagal karena drive berada di hot-swap bay dan bahkan mungkin tidak ada di sistem)

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

  if ! grep -q /backup /proc/mounts ; then
    if ! mount /backup ; then
      echo "failed"
      exit 1
    fi
  fi
  echo "suceeded."
  # do stuff here

Linux
  1. Bash Echo Baris Perintah Dieksekusi Di Baris Perintah Itu Sendiri (bukan Dalam Script)?

  2. Skrip Bash Shell - Periksa bendera dan ambil nilainya

  3. Cakupan variabel untuk skrip bash shell dan fungsi dalam skrip

  1. Cara terbaik untuk membuat skrip perintah SSH jarak jauh di Batch (Windows)

  2. Bagaimana cara memeriksa apakah ada file di direktori tertentu dalam skrip bash?

  3. Apa gunanya $# di Bash

  1. Apa perbedaan antara menjalankan skrip Bash vs sumbernya?

  2. Periksa apakah ada parameter ke skrip bash yang cocok dengan string

  3. Saya baru saja menghapus /bin. Apa cara terbaik untuk pulih?