Bir dosya sisteminin bir komut dosyasına takılı olup olmadığını kontrol etme


19

Senaryo yazımında yeniyim ... Çok basit şeyler yapabilirim, ama şimdi bir ele ihtiyacım var.

Yalnızca bir yedeklemem gerektiğinde bağlanacak yerel bir dosya sistemim var.

Bununla başlıyorum.

#!/bin/bash
export MOUNT=/myfilesystem

if grep -qs $MOUNT /proc/mounts; then
  echo "It's mounted."
else
  echo "It's not mounted."; then
  mount $MOUNT;
fi

Dediğim gibi, senaryo yazarken çok basitim. mountDönüş kodlarına bakarak komutun durumunu kontrol edebileceğinizi duydum .

RETURN CODES
       mount has the following return codes (the bits can be ORed):
       0      success
       1      incorrect invocation or permissions
       2      system error (out of memory, cannot fork, no more loop devices)
       4      internal mount bug
       8      user interrupt
       16     problems writing or locking /etc/mtab
       32     mount failure
       64     some mount succeeded

Bunu nasıl kontrol edeceğimi bilmiyorum. Herhangi bir rehberlik var mı?


2
; thenSenaryonuzda komik bir sarkan var .
Mat

neden biz MOUNT var ihracat ve ayrıca kaldırmak ";"
Mike Q

Benzer sorular Sunucu Hatası , Yığın Taşması ve Unix ve Linux Yığın Değişimi ile ilgilidir .
sasha

Yanıtlar:


19

mountShell special parametresi ile en iyi yazılan yürütülebilir dosyaların durum kodlarını kontrol edebilirsiniz ?.

Gönderen man bash:

? Expands to the exit status of the most recently executed foreground pipeline.

mountKomutu çalıştırdıktan sonra , hemen yürütmek echo $?durum kodunu önceki komuttan yazdırır.

# mount /dev/dvd1 /mnt
  mount: no medium found on /dev/sr0
# echo $?
  32

Tüm yürütülebilir dosyalar iyi tanımlanmış durum kodlarına sahip değildir. En azından, bir başarı (0) veya başarısızlık (1) koduyla çıkmalıdır, ancak durum her zaman böyle değildir.

Örnek komut dosyanızı genişletmek (ve düzeltmek) için, ifanlaşılır olması amacıyla iç içe geçmiş bir yapı ekledim . Durum kodunu test etmenin ve bir eylem gerçekleştirmenin tek yolu değildir, ancak öğrenirken okunması en kolay yöntemdir.

#!/bin/bash
mount="/myfilesystem"

if grep -qs "$mount" /proc/mounts; then
  echo "It's mounted."
else
  echo "It's not mounted."
  mount "$mount"
  if [ $? -eq 0 ]; then
   echo "Mount success!"
  else
   echo "Something went wrong with the mount..."
  fi
fi

"Çıkış ve Çıkış Durumu" hakkında daha fazla bilgi için Gelişmiş Bash-Komut Dosyası Kılavuzu'na bakabilirsiniz .


1
İhracat yapmaya gerek yok $MOUNT. Bu komut dosyası ayrıca, dosya sisteminde sözcük bölme (boşluklar, vb.) Uygulanacak herhangi bir karakter varsa kırılır. Her zaman genişlemelerinizi vermelisiniz .
Chris Down

@ChrisDown Haklısın. Sadece bariz sarkan '; sonra' sildim. Gelecekte, cevabımı daha doğru yapmak için düzenlemekten çekinmeyin.
George M

Ee ... bu hala kırılacak. Hâlâ açılımlardan alıntı yapmadınız. Tavsiyen, şimdi yapacağım.
Chris Down

Ayrıca rezil "Gelişmiş" Bash komut dosyası kılavuzuna bağlantı önermem, hatalarla dolu ve insanlara komut dosyaları değil, hata yazma öğretecek. BashGuide çok daha iyi bir alternatiftir.
Chris Down

2
@ChrisDown "Bir şeyleri düzgün bir şekilde teklif etmezseniz kelime bölme bebeklerinizi yiyecektir." Yaşanacak kelimeler.
George M

36

Birçok Linux dağıtımının mountpointkomutu vardır. Bir dizinin bağlama noktası olup olmadığını açıkça kontrol etmek için kullanılabilir. Bu kadar basit:

#!/bin/bash    
if mountpoint -q "$1"; then
    echo "$1 is a mountpoint"
else
    echo "$1 is not a mountpoint"
fi

1
Kök olmayan bir kullanıcı tarafından çalıştırıldığında izin reddedildi hatasıyla karşılaşacağınız için, bir encfs'yi kontrol etmeye çalışırsanız bu yaklaşım başarısız olur.
Denys S.

Çözümüm encfs ile çalışıyor.
Theodore R. Smith

3

Bir yol daha:

if findmnt ${mount_point}) >/dev/null 2>&1 ; then
  #Do something for positive result (exit 0)
else
  #Do something for negative result (exit 1)
fi

Merhaba @sungtm; yeni ve ayrı bir hesapla giriş yaptığınız anlaşılıyor. Senin bu yana "Güneş" hesabı çok aktiviteye sahip değildir, ben size yeni kullanmaya devam önerilerde bulunuruz "sungtm" o daha basit olduğu gibi, hesap. Ancak, hesapları birleştirmek isterseniz, bu yorumu işaretleyerek bize bildirin, biz de Stack Exchange ekibine ulaşalım. Teşekkür ederim!
Jeff Schaller

Encfs findmntiçin parametreyle birlikte verilmesi gerektiğini unutmayın --source encfs, aksi takdirde ana bağlantının altına düştüğü için her zaman bağlanacak dizini dikkate alır.
Burkart

2

Kök gerektirmeyen en kolay yol:

if $(df | grep -q /mnt/ramdisk); then

fi

veya monte edilmediğini görmek için:

if ! $(df | grep -q /mnt/ramdisk); then

fi

mountKomut root erişimi ihtiyacı yoktur, dfüzerinde ... bağlama noktaları değil disk alanı üzerine odaklanmıştır
Philippe Gachoud

1

Kısa açıklamalar

Takılı olup olmadığını kontrol edin :

mount|grep -q "/mnt/data" && echo "/mnt/data is mounted; I can follow my job!"

Takılı olup olmadığını kontrol edin :

mount|grep -q "/mnt/data" || echo "/mnt/data is not mounted I could probably mount it!"

0

Aşağıdaki script ile denedim

#!/bin/bash
echo "enter the file system to check whether its mounted or not"
read p
echo $p
for i in `cat /proc/mounts`
do
if [[ $p =~ $i ]]
then
echo "$p is mounted"
else
echo "$p is not mounted"
fi
done

Yalnızca vermeniz gereken girdi dosya sisteminin adıdır

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.