it-swarm-id.com

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

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
109
Mark Biek

Hindari pemakaian /etc/mtab karena mungkin tidak konsisten.

Hindari pemipaan mount karena itu tidak perlu yang 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 kecocokan mis. /mnt/foo-bar.)

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

atau

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

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 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 pada nama path
  • Parsing mount spasi putih bermasalah. Halaman manualnya sekarang mengatakan:

.. mode listing dipertahankan hanya untuk kompatibilitas.

Untuk penggunaan output yang lebih kuat dan dapat dikustomisasi findmnt (8), terutama di 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
21
Elliptical view

Skrip seperti ini tidak akan portabel. Sebuah 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 sistem file apa yang ada di dalamnya.

Misalnya (memerlukan POSIX Shell seperti ash/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

Agak memberitahu Anda informasi yang berguna.

7
chris

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

 jika! grep -q/backup/proc/mounts; lalu jika ! mount/cadangan; lalu 
 echo "gagal" 
 keluar 1 
 fi 
 fi 
 echo "suceeded." 
 # lakukan hal-hal di sini 
6
cas

Karena untuk me-mount, Anda perlu 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.

2
Brian Postow

Bagaimana dengan membandingkan nomor perangkat? Saya hanya mencoba memikirkan yang paling esoteris cara ..

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

Ada cacat 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 gema mungkin berlebihan, karena stat akan menampilkan kesalahan juga.

2
Kyle Brandt

Maaf karena mengemukakan ini tetapi saya pikir ini cukup berguna:

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

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.

1
David

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 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 bukan mount point, tetapi/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:

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 mount point, 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 mencerminkan titik mount di luar chroot, di dalam chroot, melalui beberapa direktori atau daftar file yang sewenang-wenang.

1
Craig

Tergantung apa yang Anda ketahui tentang volume yang Anda periksa.

Dalam kasus tertentu 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 memastikan tautannya ada (dan dihapus saat perangkat dicabut).

(Ini BUKAN jawaban yang sangat portabel; ia bekerja pada banyak distribusi Linux modern, dan pertanyaannya ditandai untuk Linux, dan ini merupakan pendekatan yang sama sekali berbeda dari apa yang telah disebutkan sejauh ini sehingga memperluas kemungkinan.)

0

Saya suka jawaban yang menggunakan /proc/mounts, tapi saya tidak suka melakukan grep sederhana. Itu bisa memberi Anda positif palsu. Apa yang Anda sungguh-sungguh ingin Anda ketahui adalah "apakah ada baris yang memiliki string persis ini 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
0
Bruno Bronosky

Meskipun ini adalah pertanyaan Linux, mengapa tidak membuatnya portabel ketika mudah dilakukan?

Halaman manual grep mengatakan:

Skrip Shell portabel harus menghindari -q dan -s dan harus mengarahkan output standar dan kesalahan ke /dev/null sebagai gantinya.

Jadi saya mengusulkan solusi berikut:

if grep /mnt/foo /proc/mounts > /dev/null 2>&1; then
        echo "Mounted"
else
        echo "NOT mounted"
fi
0
fex

grep/etc/mtab untuk mount point Anda, mungkin?

0
Ophidian

Apakah perlu lebih rumit dari ini?

mount \
    | cut -f 3 -d ' ' \
    | grep -q /mnt/foo \
  && echo "mounted" || echo "not mounted"
0
Matthew Bloch

Ini?:

volume="/media/storage"
if mount|grep $volume; then
echo "mounted"
else
echo "not mounted"
if

Dari: Forum Ubunt

0
RateControl

Buat file di bawah mountpoint Anda seperti check_mount lalu coba apakah itu ada?

if [[ -f /something/check_mount ]]; then
   echo "Mounted
   RC=$?
else
   Echo "Not mounted"
   RC=0
fi
exit $RC
0
Wiljami