web-dev-qa-db-ja.com

bashでディレクトリがマウントされているかどうかを確認します

私は使っている

mount -o bind /some/directory/here /foo/bar

Bashスクリプトを使用して/foo/barを確認し、マウントされているかどうかを確認したいのですが。そうでない場合は、上記のマウントコマンドを呼び出します。これどうやってするの?

CentOSはオペレーティングシステムです。

86
Justin

引数なしでmountコマンドを実行すると、現在のマウントがわかります。シェルスクリプトから、grepとifステートメントを使用してマウントポイントを確認できます。

if mount | grep /mnt/md0 > /dev/null; then
    echo "yay"
else
    echo "nay"
fi

私の例では、ifステートメントはgrepの終了コードをチェックしており、一致したかどうかを示しています。一致がある場合に出力を表示したくないので、/dev/nullにリダイレクトしています。

63

O/Sについて言及する必要はありません。

Ubuntu Linux 11.10(そしておそらく最新のLinux版)にはmountpointコマンドがあります。

これが私のサーバーの1つの例です。

$ mountpoint /Oracle
/Oracle is a mountpoint
$ mountpoint /bin
/bin is not a mountpoint

実際、あなたの場合、次のように-qオプションを使用できるはずです。

mountpoint -q /foo/bar || mount -o bind /some/directory/here /foo/bar

お役に立てば幸いです。

164
Mark J. Bobak

mountpointのマニュアルには次のように書かれています:

指定されたディレクトリまたはファイルが/ proc/self/mountinfoファイルで言及されているかどうかを確認します。

mountのマニュアルには次のように書かれています:

リストモードは、下位互換性のためにのみ維持されています。より堅牢でカスタマイズ可能な出力を得るには、特にスクリプトでfindmnt(8)を使用します。

したがって使用する正しいコマンドはfindmntであり、それ自体は util-linux パッケージの一部であり、マニュアル:

/ etc/fstab、/ etc/mtab、または/ proc/self/mountinfoで検索できる

したがって、実際にはmountpointよりも多くのものを検索します。また、便利なオプションも提供します。

-M、-mountpointpath

マウントポイントファイルまたはディレクトリを明示的に定義します。 --targetも参照してください。

要約すると、ディレクトリがbashでマウントされているかどうかを確認するには、次を使用できます。

if [[ $(findmnt -M "$FOLDER") ]]; then
    echo "Mounted"
else
    echo "Not mounted"
fi

例:

mkdir -p /tmp/foo/{a,b}
cd /tmp/foo

Sudo mount -o bind a b
touch a/file
ls b/ # should show file
rm -f b/file
ls a/ # should show nothing

[[ $(findmnt -M b) ]] && echo "Mounted"
Sudo umount b
[[ $(findmnt -M b) ]] || echo "Unmounted"
30
Sheljohn

私の解決策:

is_mount() {
    path=$(readlink -f $1)
    grep -q "$path" /proc/mounts
}

例:

is_mount /path/to/var/run/mydir/ || mount --bind /var/run/mydir/ /path/to/var/run/mydir/

Mark J. Bobak's answer の場合、異なるファイルシステムでmountpointオプションを指定してマウントすると、bindは機能しません。

Christopher Neylan's answer の場合、grepの出力を/ dev/nullにリダイレクトする必要はなく、代わりにgrep -qを使用します。

最も重要なのは、readlink -f $mypathを使用してパスを正規化することです:

  • /path/to/dir/などのパスをバックスラッシュで終了すると、/proc/mountsまたはmount出力のパスは/path/to/dirになります
  • ほとんどのLinuxリリースでは、/var/run//run/のシンボリックリンクです。したがって、/var/run/mypathのバインドをマウントし、マウントされているかどうかを確認すると、/run/mypath/proc/mounts ] _。
1
Tanky Woo

別のクリーンなソリューションは次のようなものです。

$ mount | grep /dev/sdb1 > /dev/null && echo mounted || echo unmounted

確かに、「echo something」は、それぞれの場合に必要なものに置き換えることができます。

0
Hudson Santos