Soru Bir Bash komut dosyasına bir birimin takılı olup olmadığını kontrol etmenin en iyi yolu nedir?


Bir Bash komut dosyasına bir birimin takılı olup olmadığını kontrol etmenin en iyi yolu nedir?

Gerçekten sevdiğim şey şu şekilde kullanabileceğim bir yöntem:

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

91
2017-08-05 20:16


Menşei


Bunu kendim yapmak için bir senaryo yazmak üzereydim. İlk düşüncem / etc / mtab'dan bilgi almak. Ama daha doğrudan bir yolun olup olmadığını görmek için bash kitaplarına parmak basmadım. - 3dinfluence
@ 3dinfluence - evet bunu uzun zaman önce biliyorum ama /etc/mtab, /proc/mounts bağlı /proc/self/mounts. (Fedora 20'de en az) - Wilf


Cevaplar:


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

Boru tesisatından kaçının mount çünkü o kadar karmaşık olması gerekmiyor.

basitçe:

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

(Sonra alan /mnt/foo eşleşmemek, örn. /mnt/foo-bar.)


105
2017-08-05 20:27



Bahsetmemek gerekirse, bağlantı noktası kamaya takılıysa, bir montaj çağrısı askıda kalabilir. - Chad Huneycutt
Linux için iyi, freebsd veya solaris için değil. - chris
Bu doğru, Chris. Soru linux olarak etiketlenmiş olmasına rağmen. - Dan Carley
Sanırım bu bir felsefi sorudur - eğer mümkünse işleri taşınabilir hale getirmeye çalışmalı mıyız yoksa sadece dünyanın tüm çalışan windows / linux'larını kabul etmeli ve buna göre davranmalı mıyız? - chris
Aslında, '/ mnt / foo' için test etmelisiniz, yani. Bir boşluk ile veya örneğin adında bir birim yerleştirdiyseniz yanlış bir pozitif alabilirsiniz. 'Kedi köpek'. Bu sorunu sadece iki bağlama noktası olan 'lmde' ve 'lmde-home' ile aldım. - marlar


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

veya

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

53
2018-01-04 08:33



Sadece bilgi için: mountpoint Ubuntu / Debian'daki "initscripts" paketinden kaynaklanır. - blueyed
Benim için çalışmadı - :-( - Wilf
Bu, Vagrant'ımın takıldığı çağrı. - dhill
İle ilgili sorun mountpoint Aslında, bir montaj noktası monte edilmişse, ancak bir cihaz monte edilmişse, kontrol eder. Bir cihaz ile geçirilirse -x seçeneği size ana / küçük cihaz numarasını bildirir, ancak takılı değilse. - vegatripy


Böyle bir senaryo asla taşınabilir değildir. Unix'teki kirli bir sır, yalnızca kernelin hangi dosya sistemlerinin nerede olduğunu ve / proc (taşınabilir değil) gibi şeylerin kısa olduğunu bilmesinin, size asla doğru bir cevap vermeyeceğidir.

Genellikle bir alt dizinin bağlantı noktasının ne olduğunu ve hangi dosya sisteminin içinde olduğunu keşfetmek için df kullanırım.

Örneğin (kül / AT & T ksh / bash / etc gibi posix kabuğu gerektirir)

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

Kinda size yararlı bilgiler veriyor.


6
2017-08-05 20:32



Soru linux olarak etiketlenmiş, belki de taşınabilir olmak zorunda değil - Rory


rsync yedekleme cron-işlerimden birinde kullandığım şudur. / backup'ın takılı olup olmadığını kontrol eder ve değilse takmaya çalışır (sürücü çalışırken değiştirilebilir bir yuvada ve sistemde bile mevcut olmayabilir).

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

  Eğer ! grep -q / backup / proc / mounts; sonra
    Eğer ! mount / backup; sonra
      echo "başarısız"
      çıkış 1
    fi
  fi
  echo "başarılı"
  # burada bir şeyler yap

6
2017-08-05 20:39



İyi bir akıl sağlığı kontrol alternatifi olarak düşünüldü. - Dan Carley
Muhtemelen bu yöntem, Matthew Bloch'un cevabıyla aynı sorunlara yol açar. - mwfearnley
evet, “Eliptical view” (“Eliptik görünüm”) ile belirtilen dosya içinde yer alan boşluk haricinde (bu sadece bir çıkartılmış alan değil). Alt-dizgi sorunu, argümanları alıntılamanın yapabileceğiniz bir şey olduğunu bir şekilde unutmazsanız, büyük bir anlaşma değildir. Örneğin. grep -q ' /backup ' /proc/mounts veya mount | grep -q ' /backup '. Veya grep'iniz desteklemiyorsa / dev / null adresine yönlendirin -q (hangi olduğu grep bu gün için POSIX spec). - cas


findmnt -rno SOURCE,TARGET "$1" Diğer cevaplardaki tüm problemleri önler. İşi tek bir komutla temiz yapar.


Diğer yaklaşımlar bu downsides var:

  • ayrıştırma dağbeyaz boşluk problemlidir. Şimdi adam sayfa diyor ki:

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

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


  • grep -q ve grep -s gereksiz bir adımdır ve her yerde desteklenmez.
  • /proc/\* her yerde desteklenmiyor.
  • mountinfo / proc / .. dayanmaktadır
  • cut -f3 -d' ' yol adlarında boşlukları karıştırır

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

5
2018-03-15 16:42



Linux için yine de bu gerçekten en iyi yaklaşım. Ben gördüm findmnt(8) komuta ama ben hiç oynamamıştım. Açıkçası, bir Linux kutusuna (veya komutun kullanılabilir olduğu yerde) bu tür bir şeyi (veya yeni olanları) yapan komut dosyalarından bazılarını güncellemem gerekirse, bu benim yaptığım şeydir. - Pryftan


Monte edebilmek için, orada bir dizinin olması gerekir, bunun üzerine monte edilir, benim stratejim her zaman kullanılamayan garip bir dosya adıyla sahte bir dosya oluşturmaktı ve sadece varlığını kontrol et. Dosya orada olsaydı, o noktaya hiçbir şey monte edilmedi ...

Bunun ağ sürücüleri veya bunun gibi şeyleri monte etmek için işe yaradığını sanmıyorum. Flaş sürücüler için kullandım.


2
2017-08-05 20:36





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

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

Mantığımdaki 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

Yankı hata iletileri büyük olasılıkla gereksizdir, çünkü stat bir hata da gösterecektir.


2
2017-08-05 20:57



Aslında, muhtemelen her bir arama için önce statünün statüsünü kontrol etmek zorunda kalırsınız. Dosyanın orada olduğundan emin olmak için ... düşündüğüm gibi roman olarak değil :-( - Kyle Brandt♦