Vraag Wat is de beste manier om te controleren of een volume is gemount in een Bash-script?


Wat is de beste manier om te controleren of een volume is gemount in een Bash-script?

Wat ik echt leuk zou vinden, is een methode die ik als volgt kan gebruiken:

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

90
2017-08-05 20:16


oorsprong


Ik stond op het punt om een ​​script te schrijven om dit zelf te doen. Mijn eerste gedachte is om info te krijgen uit / etc / mtab Maar ik heb nog niet mijn bash-boeken doorgenomen om te zien of er een directere manier is. - 3dinfluence
@ 3dinfluence - ja ik weet dit al lang geleden, maar /etc/mtab, /proc/mounts zijn gekoppeld met /proc/self/mounts. (tenminste, het is Fedora 20) - Wilf


antwoorden:


Vermijd te gebruiken /etc/mtab omdat het inconsistent kan zijn.

Vermijd piping mount omdat het niet zo ingewikkeld hoeft te zijn.

gewoon:

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

(De spatie achter de /mnt/foo is het vermijden van het matchen van b.v. /mnt/foo-bar.)


103
2017-08-05 20:27



Om nog maar te zwijgen, een oproep om te monteren kan hangen als het koppelpunt ingeklemd is. - Chad Huneycutt
Goed voor Linux, niet voor freebsd of solaris. - chris
Dit is waar, Chris. Hoewel de vraag gelabeld was met linux. - Dan Carley
Ik denk dat dit een filosofische vraag is - moeten we proberen dingen zo mogelijk draagbaar te maken of moeten we gewoon aannemen dat alle draaiende windows / linux in de hele wereld en dienovereenkomstig handelen? - chris
Eigenlijk zou je moeten testen voor '/ mnt / foo', dat wil zeggen. met een spatie of je zou een vals positief kunnen krijgen als je een volume genaamd eg. 'Fooks'. Ik kreeg net dat probleem met twee koppelpunten, 'lmde' en 'lmde-home'. - marlar


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

of

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

53
2018-01-04 08:33



Alleen voor informatie: mountpoint is afkomstig van het pakket "initscripts" in Ubuntu / Debian. - blueyed
Werkte niet voor mij - :-( - Wilf
Dit is de oproep, waar mijn Vagrant op blijft hangen. - dhill
Het probleem met mountpoint is dat het feitelijk controleert of een aankoppelpunt is gemonteerd, maar niet als een apparaat is aangekoppeld. Als een apparaat wordt doorgegeven met de -x optie geeft het het major / minor apparaatnummer aan, maar niet als het is gemount. - vegatripy


Een script als dit zal nooit draagbaar zijn. Een vies geheim in unix is ​​dat alleen de kernel weet welke bestandssystemen waar zijn, en kort bij dingen als / proc (niet draagbaar) zal het je nooit een duidelijk antwoord geven.

Ik gebruik meestal df om te ontdekken wat het koppelpunt van een submap is en in welk bestandssysteem het zich bevindt.

Bijvoorbeeld (vereist posix shell zoals 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

Kinda vertelt u nuttige informatie.


6
2017-08-05 20:32



De vraag is gelabeld met linux, dus misschien hoeft het niet draagbaar te zijn - Rory


het volgende is wat ik gebruik in een van mijn rsync backup cron-jobs. het controleert of / backup is gemount, en probeert het te koppelen als dit niet het geval is (het kan falen omdat de drive zich in een hot-swap bay bevindt en mogelijk niet eens aanwezig is in het systeem)

Opmerking: het volgende werkt alleen op Linux, omdat het greps / proc / mounts - een meer draagbare versie zou 'mount | uitvoeren' grep / backup ', zoals in het antwoord van Matthew ..

  als ! grep -q / backup / proc / mounts; dan
    als ! mount / backup; dan
      echo "mislukt"
      afslag 1
    fi
  fi
  echo "suceeded."
  # dingen doen hier

6
2017-08-05 20:39



Opgewaardeerd als een goed gezond verstand controle alternatief. - Dan Carley
Vermoedelijk loopt deze methode tegen dezelfde problemen aan als het antwoord van Matthew Bloch. - mwfearnley
ja, behalve het probleem van de ruimte-in-bestandsnaam dat wordt genoemd in "Eliptical view" (dit is de hele regel en niet alleen een geëxtraheerd veld). Het sub-string probleem is niet erg, tenzij je op de een of andere manier vergeet dat het citeren van argumenten iets is dat je kunt doen. bijv. grep -q ' /backup ' /proc/mounts of mount | grep -q ' /backup '. Of stuur door naar / dev / null als je grep dit niet ondersteunt -q (welke is in de POSIX-specificatie voor grep tegenwoordig). - cas


findmnt -rno SOURCE,TARGET "$1" vermijdt alle problemen in de andere antwoorden. Het doet het werk netjes met slechts één opdracht.


Andere benaderingen hebben deze nadelen:

  • Parsing bergDe witte ruimte is problematisch. De manpagina zegt nu:

... de lijstmodus wordt alleen behouden voor compatibiliteit met eerdere versies.

Voor meer robuust en aanpasbaar outputgebruik findmnt(8), vooral in uw scripts.


  • grep -q en grep -s zijn een extra overbodige stap en worden niet overal ondersteund.
  • /proc/\* wordt niet overal ondersteund.
  • mountinfo is gebaseerd op / proc / ..
  • cut -f3 -d' ' ruimt spaties in padnamen op

functies:

#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

Gebruik voorbeelden:

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



Voor Linux is dit hoe dan ook echt de beste aanpak. Ik heb het gezien findmnt(8) commando, maar ik heb er nooit echt mee gespeeld. Eerlijk gezegd als ik een aantal van mijn scripts zou updaten die dit soort dingen doen (of nieuwe maken) in een Linux-box (of waar de opdracht beschikbaar is), zou ik dit doen. - Pryftan


Omdat je om te mounten moet je daar toch een directory hebben, die wordt aangekoppeld, mijn strategie was altijd om een ​​nepbestand te maken met een vreemde bestandsnaam die nooit zou worden gebruikt, en gewoon controleren of het bestaat. Als het bestand daar was, dan werd niets op die plek gemonteerd ...

Ik denk niet dat dit werkt voor het koppelen van netwerkschijven of dergelijke. Ik gebruikte het voor flash drives.


2
2017-08-05 20:36





Hoe zit het met het vergelijken van apparaatnummers? Ik probeerde er het meest aan te denken esoterisch manier..

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

Er zit een fout in mijn logica met dat ...

Als een functie:

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

De echo-foutmeldingen zijn waarschijnlijk overbodig, omdat stat ook een fout zal weergeven.


2
2017-08-05 20:57



Eigenlijk zou ik waarschijnlijk eerst de exit-status van stat voor elke oproep moeten controleren om er zeker van te zijn dat het bestand er is ... niet zo nieuw als ik dacht :-( - Kyle Brandt♦