web-dev-qa-db-ja.com

ボリュームがBashスクリプトにマウントされているかどうかを確認する最良の方法は何ですか?

ボリュームがBashスクリプトにマウントされているかどうかを確認する最良の方法は何ですか?

私が本当に望んでいるのは、このように使用できる方法です。

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

/etc/mtabは一貫性がない可能性があるため、使用しないでください。

それほど複雑にする必要がないため、mountのパイプは避けてください。

単に:

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

/mnt/fooの後のスペースは、たとえば/mnt/foo-barのような一致を避けるためです。)

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

または

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

findmnt -rno SOURCE,TARGET "$1"他の回答のすべての問題を回避します。それはたった1つのコマンドできれいに仕事をします。


他のアプローチにはこれらの欠点があります:

  • grep -qおよびgrep -sは余分な不要なステップであり、すべての場所でサポートされているわけではありません。
  • /proc/\*はどこでもサポートされているわけではありません。
  • mountinfoは/ proc /に基づいています。
  • cut -f3 -d' 'パス名のスペースを混乱させる
  • 解析mountの空白には問題があります。これは、manページに次のように書かれています。

..リストモードは、下位互換性のためにのみ維持されています。

より堅牢でカスタマイズ可能な出力には、特にスクリプトでfindmnt(8)を使用します。


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

使用例:

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
21
Elliptical view

このようなスクリプトは移植可能にはなりません。 unixのひっそりとした秘密は、カーネルだけがファイルシステムがどこにあるかを知っており、/ proc(ポータブルではない)のようなものが不足していると、正直な答えが得られないことです。

私は通常、dfを使用して、サブディレクトリのマウントポイントとは何か、それがどのファイルシステムにあるかを調べます。

たとえば(ash/AT&T ksh/bashなどのposix Shellが必要です)

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

ちょっと便利な情報を教えてくれます。

7
chris

以下は、rsyncバックアップcronジョブの1つで使用するものです。/backupがマウントされているかどうかを確認し、マウントされていない場合はマウントを試みます(ドライブがホットスワップベイにあり、システムに存在していない可能性があるために失敗する可能性があります)

注:以下は、/ proc/mountsを読み取るため、Linuxでのみ機能します。よりポータブルなバージョンでは、「mount |マシューの答えのように、grep/backup '。

もし! grep -q/backup/proc/mounts;次に
もし! mount/backup;次に、
 echo "失敗しました" 
 exit 1 
 fi 
 fi 
 echo "suceeded。" 
#ここで何かを行います
6
cas

マウントするためには、とにかくそこにマウントされるディレクトリが必要なので、私の戦略は常に、決して使用されない奇妙なファイル名で偽のファイルを作成し、その存在を確認することでした。ファイルがあった場合、その場所には何もマウントされていません...

私はこれがネットワークドライブなどをマウントするのにうまくいくとは思いません。フラッシュドライブに使用しました。

2
Brian Postow

デバイス数を比較してみませんか?私はちょうど難解な方法を考えようとしていました。

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

それで私の論理に欠陥があります...

関数として:

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

Statもエラーを表示するため、エコーエラーメッセージはおそらく冗長です。

2
Kyle Brandt

これを取り上げて申し訳ありませんが、これはかなり便利だと思います:

if awk '{print $2}' /proc/mounts | grep -qs "^/backup$"; then
    echo "It's mounted."
else
    echo "It's not mounted."
fi

/ proc/mountsの2列目を取得します(2列目=マウントポイント)。

次に、出力を読み取ります。 ^と$に注意してください。これにより、/ backupが/ mnt/backupまたは/ backup-oldなどと一致しなくなります。

1
David

これらはいずれも、特定のディレクトリが別のマウントポイント内のサブディレクトリである場合の使用例を満たしていません。たとえば、Host:/ real_thingへのNFSマウントである/ thingがあるとします。/proc/mounts/etc/mtabまたは 'mount'でこの目的のためにgrepを使用しても、存在しないマウントポイントを探すため、機能しません。たとえば、/ thing/thingyはマウントポイントではありませんが、/ thingはHost:/ real_thingにマウントされます。ここで投票した最良の答えは、実際には「ディレクトリ/ボリュームがマウントされているかどうかを判断する最良の方法」ではありません。クリーンな戦略として「df -P」(-P POSIX標準モード)を使用して賛成票を投じます。

dev=`df -P /thing/thingy | awk 'BEGIN {e=1} $NF ~ /^\/.+/ { e=0 ; print $1 ; exit } END { exit e }'` && {
    echo "Mounted via: $dev"
} || {
    echo "Not mounted"
}

これを実行すると、次のように出力されます。

Mounted via: Host:/real_thing

実際のマウントポイントを知りたい場合は、問題ありません。

mp=`df -P /thing/thingy | awk 'BEGIN {e=1} $NF ~ /^\/.+/ { e=0 ; print $NF ; exit } END { exit e }'` && {
    echo "Mounted on: $mp"
} || {
    echo "Not mounted"
}

そのコマンドの出力は次のようになります。

Mounted on: /thing

これは、chroot内の任意のディレクトリまたはファイルリストを介して、chrootの外部のマウントポイントをミラーリングするchrootの種類を作成しようとしている場合に非常に役立ちます。

1
Craig

チェックするボリュームについて知っていることに依存します。

私が最近調査した特定のケースでは、特定のフラッシュドライブがマウントされているかどうかを確認する必要があり、最も簡単に機能するのは、/ dev/disks/by-label /の存在を確認することです。デバイスが接続されている場合、udevスクリプトはリンクが存在すること(およびデバイスが接続されていないときにリンクが削除されること)を確認します。

(これは移植性の高い答えではありません。ただし、多くの最新のLinuxディストリビューションで機能します。質問はLinuxにタグ付けされており、これまでに述べたものとはまったく異なるアプローチなので、可能性が広がります。)

0

/proc/mountsを使用する回答は好きですが、単純なgrepをするのは好きではありません。それはあなたに偽陽性を与える可能性があります。 本当に知りたいのは、「どの行にもフィールド番号2のこの正確な文字列があるか」です。だから、その質問をしてください。 (この場合、私は/optをチェックしています)

awk -v status=1 '$2 == "/opt" {status=0} END {exit status}' /proc/mounts

# and you can use it in and if like so:

if awk -v status=1 '$2 == "/opt" {status=0} END {exit status}' /proc/mounts; then
  echo "yes"
else
  echo "no"
fi
0
Bruno Bronosky

これはLinuxの質問ですが、簡単に実行できる場合は移植可能にしてみませんか?

grepのマニュアルページにはこう書かれています:

ポータブルシェルスクリプトは、-qと-sの両方を回避し、標準出力とエラー出力を/dev/nullにリダイレクトする必要があります。

だから私は次の解決策を提案します:

if grep /mnt/foo /proc/mounts > /dev/null 2>&1; then
        echo "Mounted"
else
        echo "NOT mounted"
fi
0
fex

マウントポイントのgrep/etc/mtabは多分?

0
Ophidian

これより複雑にする必要はありますか?

mount \
    | cut -f 3 -d ' ' \
    | grep -q /mnt/foo \
  && echo "mounted" || echo "not mounted"
0
Matthew Bloch

この?:

volume="/media/storage"
if mount|grep $volume; then
echo "mounted"
else
echo "not mounted"
if

From: buntuフォーラム

0
RateControl

check_mountのようなマウントポイントの下にファイルを作成し、それが存在するかどうかをテストしますか?

if [[ -f /something/check_mount ]]; then
   echo "Mounted
   RC=$?
else
   Echo "Not mounted"
   RC=0
fi
exit $RC
0
Wiljami