Jak sprawdzić, czy system plików jest zamontowany ze skryptem

19

Jestem nowy w skryptowaniu ... Potrafię robić bardzo proste rzeczy, ale teraz potrzebuję pomocy.

Mam lokalny system plików, który zostanie zamontowany tylko wtedy, gdy będę musiał wykonać kopię zapasową.

Zaczynam od tego.

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

Jak powiedziałem, jestem bardzo prosty w skryptowaniu. Słyszałem, że możesz sprawdzić status mountpolecenia, patrząc na kody powrotu.

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

Nie wiem jak to sprawdzić. Jakieś wskazówki?

maniat1k
źródło
2
W ; thentwoim skrypcie masz zabawne zwisanie .
Mat
dlaczego eksportujemy MOUNT var, a także usuwamy „;”
Mike Q
Podobne pytania dotyczą błędu serwera , przepełnienia stosu oraz wymiany stosu Unix i Linux .
sasha

Odpowiedzi:

19

Możesz sprawdzić kod statusu mounti najlepiej napisanych plików wykonywalnych za pomocą specjalnego parametru powłoki ?.

Od man bash:

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

Po uruchomieniu mountpolecenia natychmiastowe wykonanie echo $?spowoduje wydrukowanie kodu stanu z poprzedniego polecenia.

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

Nie wszystkie pliki wykonywalne mają dobrze zdefiniowane kody stanu. Powinien on co najmniej kończyć się kodem powodzenia (0) lub niepowodzenia (1), ale nie zawsze tak jest.

Aby rozwinąć (i poprawić) przykładowy skrypt, dodałem zagnieżdżoną ifkonstrukcję dla zachowania przejrzystości. To nie jedyny sposób na przetestowanie kodu stanu i wykonanie akcji, ale najłatwiej jest go przeczytać podczas nauki.

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

Aby uzyskać więcej informacji na temat „Exit and Exit Status”, zapoznaj się z Advanced Bash-Scripting Guide .

George M.
źródło
1
Nie ma potrzeby eksportowania $MOUNT. Ten skrypt również się zepsuje, jeśli system plików ma znak, który podlegałby podziałowi słów (spacje itp.). Należy zawsze podać swój rozwinięć.
Chris Down
@ChrisDown Masz rację. Usunąłem tylko oczywiste zwisające „; potem”. W przyszłości możesz edytować moją odpowiedź, aby była bardziej poprawna.
George M,
Eee ... to wciąż się psuje. Nadal nie zacytowałeś rozszerzeń. Za twoją radą zrobię to teraz.
Chris Down
Nie polecałbym również linkowania do niesławnego „zaawansowanego” przewodnika skryptowego Bash, jest pełen błędów i nauczy ludzi pisania błędów, a nie skryptów. BashGuide jest znacznie lepszą alternatywą.
Chris Down
2
@ChrisDown „Podział słów zje twoje dzieci, jeśli nie zacytujesz czegoś poprawnie”. Słowa, według których można żyć.
George M,
35

Wiele dystrybucji Linuksa ma mountpointpolecenie. Można go jawnie wykorzystać do sprawdzenia, czy katalog jest punktem podłączenia. Proste jak to:

#!/bin/bash    
if mountpoint -q "$1"; then
    echo "$1 is a mountpoint"
else
    echo "$1 is not a mountpoint"
fi
Grosshat
źródło
1
To podejście zakończy się niepowodzeniem, jeśli spróbujesz sprawdzić szyfrowanie, ponieważ natkniesz się na błąd odmowy uprawnień, gdy zostanie uruchomiony przez użytkownika innego niż root.
Denys S.
Moje rozwiązanie działa z encfs.
Theodore R. Smith
3

Jeszcze jeden sposób:

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
Słońce
źródło
Witaj @sungtm; wygląda na to, że zalogowałeś się przy użyciu nowego, oddzielnego konta. Ponieważ Twoje konto „Sun” nie ma zbyt dużej aktywności, sugeruję, abyś kontynuował korzystanie z nowego konta „sungtm” , ponieważ jest to prostsze. Jeśli jednak chcesz połączyć konta, daj mi znać, oznaczając ten komentarz, a my skontaktujemy się z zespołem Stack Exchange. Dziękuję Ci!
Jeff Schaller
Zauważ, że dla enfs, findmntmusi być dostarczony z parametrem --source encfs, w przeciwnym razie zawsze będzie rozważał podłączenie katalogu, ponieważ wraca on do montowania nadrzędnego.
Burkart
2

Najprostszym sposobem, który nie wymaga rootowania jest:

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

fi

lub sprawdzić, czy nie jest zamontowany:

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

fi
Theodore R. Smith
źródło
mountkomenda nie potrzebuje dostępu do konta roota, dfkoncentruje się na przestrzeni dyskowej nie na punkty montowania ...
Philippe Gachoud
1

Krótkie wypowiedzi

Sprawdź, czy zamontowano :

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

Sprawdź, czy nie jest zamontowany :

mount|grep -q "/mnt/data" || echo "/mnt/data is not mounted I could probably mount it!"
Philippe Gachoud
źródło
0

Próbowałem z poniższym skryptem

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

Jedyne, co musisz podać, to nazwa systemu plików

Praveen Kumar BS
źródło