it-swarm.asia

Bash betiğine bir birimin takılı olup olmadığını kontrol etmenin en iyi yolu nedir?

Bash betiğine bir birimin takılı olup olmadığını kontrol etmenin en iyi yolu nedir?

Gerçekten ne gibi bir yöntem bu gibi kullanabilirsiniz:

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

Kullanmaktan kaçın /etc/mtab çünkü tutarsız olabilir.

mount boru tesisatından kaçının çünkü bu kadar karmaşık olması gerekmez.

Basitçe:

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

(/mnt/foo; /mnt/foo-bar.)

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

veya

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

findmnt -rno SOURCE,TARGET "$1" diğer cevaplardaki tüm problemlerden kaçınır. İşi tek bir komutla temiz bir şekilde yapar.


Diğer yaklaşımların bu dezavantajları vardır:

  • grep -q ve grep -s ekstra bir adımdır ve her yerde desteklenmez.
  • /proc/\* her yerde desteklenmiyor.
  • mountinfo/proc/dizinini temel alır.
  • cut -f3 -d' ' yol adlarındaki boşlukları karıştırıyor
  • Ayrıştırma mount 'ın beyaz alanı sorunludur. Artık adam sayfası diyor ki:

.. listeleme modu sadece geriye dönük uyumluluk için korunur.

Daha sağlam ve özelleştirilebilir çıktılar için, özellikle komut dosyalarınızda findmnt (8) kullanın.


Bash fonksiyonları:

#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

Kullanım örnekleri:

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

Böyle bir senaryo hiç taşınabilir olmayacak. Unix'teki kirli bir sır, yalnızca çekirdeğin hangi dosya sistemlerinin nerede olduğunu bilmesi ve/proc (taşınabilir değil) gibi şeylerin kısa olmasının size asla düz bir cevap vermemesidir.

Genellikle bir alt dizinin bağlama noktasının ne olduğunu ve hangi dosya sisteminde olduğunu keşfetmek için df kullanıyorum.

Örneğin (ash/AT&T ksh/bash/vb. Gibi Shell posix gerektirir)

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

Biraz faydalı bilgiler verir.

7
chris

aşağıdaki benim rsync yedekleme cron işleri birinde kullandığım şeydir./yedeklemenin takılı olup olmadığını kontrol eder ve takılı değilse monte etmeye çalışır (sürücü çalışırken değiştirilebilir bir bölmede olduğu ve sistemde bulunmayabileceği için başarısız olabilir)

NOT: aşağıdakiler yalnızca linux üzerinde çalışır, çünkü greps/proc/mounts - daha taşınabilir bir sürüm 'mount | grep/backup ', Matthew cevabında olduğu gibi ..

  Eğer ! grep -q/backup/proc/bağlar; o zaman eğer ! bağlama/yedekleme; sonra 
 echo "başarısız oldu" 
 çıkış 1 
 fi 
 fi 
 echo "başarılı oldu." 
 # burada bir şeyler yapın 
6
cas

Bağlamak için, yine de orada bir dizinin olması gerekir, bu da bağlanır, stratejim her zaman asla kullanılmayacak garip bir dosya adına sahip sahte bir dosya oluşturmak ve sadece varlığını kontrol etmekti. Dosya orada olsaydı, o noktaya hiçbir şey monte edilmedi ...

Bunun ağ sürücülerini veya bunun gibi şeyleri monte etmek için çalıştığını sanmıyorum. Flash sürücüler için kullandım.

2
Brian Postow

Cihaz numaralarını karşılaştırmaya ne dersiniz? Sadece en çok düşünmeye çalışıyordum ezoterik yol ..

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

Bununla ilgili mantığımda bir kusur var ...

İşlev olarak:

#!/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

Echo hata mesajları muhtemelen gereksizdir, çünkü stat de bir hata görüntüler.

2
Kyle Brandt

Bu getirmek için üzgünüm ama bu oldukça yararlı olduğunu düşünüyorum:

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

Bu,/proc/bağların 2. sütununu alır (2. sütun = bağlanma noktaları).

Sonra çıktı selamlıyor. ^ Ve $ 'a dikkat edin, bu/yedeklemenin/mnt/backup veya/backup-old vs.

1
David

Bunların hiçbiri, belirli bir dizinin başka bir bağlama noktası içindeki bir alt dizin olduğu kullanım durumunu karşılamaz. Örneğin, Host:/real_thing için bir NFS mount olan/şey olabilir./Proc/mounts/etc/mtab veya 'mount' üzerinde grep kullanmak işe yaramaz, çünkü var olmayan bir bağlama noktası arayacaksınız. Örneğin,/thing/thingy bir bağlama noktası değildir, ancak Host// real_thing dizinine/thing bağlanmıştır. Burada oylanan en iyi cevap aslında "bir dizin/hacim monte edilip edilmediğini belirlemenin en iyi yolu" DEĞİLDİR. Daha temiz bir strateji olarak 'df -P' (-P POSIX standartları modu) kullanarak lehte oy verirdim:

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"
}

Bunu çalıştırmanın çıktısı:

Mounted via: Host:/real_thing

Gerçek bağlama noktasının ne olduğunu bilmek istiyorsanız, sorun değil:

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"
}

Bu komutun çıktısı şöyle olacaktır:

Mounted on: /thing

Tüm gelişigüzel dizin veya dosya listesi aracılığıyla, bağlantının noktalarını krootun dışında, krootun içinde yansıtan bir çeşit kroot oluşturmaya çalışıyorsanız, bu çok yararlıdır.

1
Craig

Kontrol ettiğiniz birim hakkında bildiklerinize bağlıdır.

Son zamanlarda araştırdım, belirli bir flash sürücünün takılı olup olmadığını bulmak için endişelendiğim, en kolay çalışan/dev/disk/by-label/varlığını kontrol etmektir. Aygıt takılıysa, udev komut dosyaları bağlantının var olduğundan (ve aygıt çıkarıldığında çıkarıldığından) emin olun.

(Bu son derece portatif bir cevap DEĞİL; birçok modern Linux dağıtımında çalışıyor ve soru Linux için etiketlendi ve şimdiye kadar bahsettiğimiz şeylerden tamamen farklı bir yaklaşım, bu yüzden olasılıkları genişletiyor.)

0

/proc/mounts, ama basit bir grep yapmaktan hoşlanmıyorum. Bu size yanlış pozitifler verebilir. Gerçekten bilmek istediğiniz şey "Satırlardan herhangi birinin alan numarası 2 için tam olarak bu dizeyi var mı?" Bu soruyu sorun. (bu durumda /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

Bu bir Linux sorusu olmasına rağmen, kolayca yapıldığında neden taşınabilir yapmıyorsunuz?

grep kılavuz sayfası şöyle diyor:

Taşınabilir Kabuk komut dosyaları -q ve -s değerlerinden kaçınmalı ve standart ve hata çıktısını /dev/null yerine.

Bu yüzden aşağıdaki çözümü öneriyorum:

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

belki bağlama noktanız için grep/etc/mtab?

0
Ophidian

Bundan daha karmaşık olması gerekiyor mu?

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

Bu?:

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

Gönderen: Bir Ubuntu forum

0
RateControl

Bağlama noktanızın altında check_mount ve sonra sadece var olup olmadığını test etmek?

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