GNU/Linux >> Linux Esercitazione >  >> Linux

Qual è il modo migliore per verificare se un volume è montato in uno script Bash?

Soluzione 1:

Evita di usare /etc/mtab perché potrebbe essere incoerente.

Evita il piping mount perché non deve essere così complicato.

Semplicemente:

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

(Lo spazio dopo il /mnt/foo è evitare la corrispondenza, ad es. /mnt/foo-bar .)

Soluzione 2:

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

o

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

Soluzione 3:

findmnt -rno SOURCE,TARGET "$1" evita tutti i problemi nelle altre risposte. Fa il lavoro in modo pulito con un solo comando.

Altri approcci hanno questi aspetti negativi:

  • grep -q e grep -s sono un passaggio extra non necessario e non sono supportati ovunque.
  • /proc/\* non è supportato ovunque. (mountpoint si basa anche su proc).
  • mountinfo è basato su /proc/..
  • cut -f3 -d' ' incasina gli spazi nei nomi dei percorsi
  • Analisi di mount lo spazio bianco di è problematico. La sua pagina man ora dice:

.. la modalità elenco viene mantenuta solo per compatibilità con le versioni precedenti.

Per un output più solido e personalizzabile usa findmnt (8), specialmente nei tuoi script.

Funzioni 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

Esempi di utilizzo:

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

Soluzione 4:

Uno script come questo non sarà mai portatile. Uno sporco segreto in unix è che solo il kernel sa dove si trovano i filesystem e, a parte cose come /proc (non portabile), non ti darà mai una risposta diretta.

Di solito uso df per scoprire qual è il punto di montaggio di una sottodirectory e in quale filesystem si trova.

Ad esempio (richiede shell posix come 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 ti dice informazioni utili.

Soluzione 5:

quanto segue è quello che uso in uno dei miei cron-job di backup di rsync. controlla se /backup è montato e prova a montarlo se non lo è (potrebbe fallire perché l'unità si trova in un alloggiamento hot-swap e potrebbe anche non essere presente nel sistema)

NOTA:quanto segue funziona solo su Linux, perché greps /proc/mounts - una versione più portabile eseguirà 'mount | grep /backup', come nella risposta di Matthew..

  if ! grep -q /backup /proc/mounts ; then
    if ! mount /backup ; then
      echo "failed"
      exit 1
    fi
  fi
  echo "suceeded."
  # do stuff here

Linux
  1. Il modo migliore per rilevare (da uno script) se il software è installato?

  2. Bash Echo La riga di comando eseguita sulla riga di comando stessa (non in uno script)?

  3. Qual è il modo migliore per garantire che sia in esecuzione solo un'istanza di uno script Bash?

  4. Bash Shell Script:verifica la presenza di un flag e acquisisci il suo valore

  5. Ambito variabile per gli script e le funzioni della shell bash nello script

Come verificare se esiste un file in una directory specifica in uno script bash?

Qual è l'uso di $# in Bash

Qual è il modo migliore per unire nuovamente i file dopo averli divisi?

Qual è il modo migliore per imparare SELinux?

Qual è il modo più sicuro e portatile per invocare il binario echo?

Qual è il modo più veloce per eseguire uno script?