检查目录是否用bash挂载


94

我在用

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

我想/foo/bar用bash脚本检查一下,看看是否已挂载?如果不是,则调用上面的mount命令,否则执行其他操作。我怎样才能做到这一点?

CentOS是操作系统。


类似于“如果[[[$(mount -l ... | fgrep ... | wc -l)]];然后...”
bobah 2012年

服务器故障堆栈溢出以及Unix和Linux堆栈交换也存在类似的问题。
Sasha

Answers:


70

运行mount不带参数的命令将告诉您当前的安装。从shell脚本中,您可以使用grep和if语句检查安装点:

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

在我的示例中,if语句正在检查的退出代码grep,该代码指示是否存在匹配项。由于我不希望在匹配时显示输出,因此将其重定向到/dev/null


4
您无需检查它是否返回字符串。grep如果没有匹配项,则返回非零退出状态。不需要测试,也不需要$()创建的子外壳。if command | grep -q 'stuff'; then ...
jordanm 2012年

31
这不适用于安装绑定,因此不应作为答案。这个答案应该被否决。 您不能依赖于mount | grep ...向您显示安装绑定仍处于活动状态。如果卸载并重新安装了底层设备,即使mount仍然显示已连接,安装绑定实际上将不再连接两个文件/目录。如果这样做,umount ...它甚至会告诉您它尚未安装,尽管mount它说是。linux文件系统中的巨大缺陷。
Dev Null 2013年

@DevNull:我确实遇到了您描述的问题。这个问题有什么解决办法吗?
艾萨克2014年

@Isaac,很抱歉延迟您的回复。我会尝试使用readlink -f,当路径/文件不存在时,它不会返回任何内容。如果底层的/ mount / path / to_file不存在(按每个readlink),则底层的装载将中断(重新装载底层的装载和绑定)。如果基础文件在那里,并且readlink -f说该文件的绑定版本不存在,则绑定被破坏,只需重新安装绑定即可。
Dev Null 2014年

2
如果有一个安装程序被调用,/mnt/md0xxx那么该命令将指示/mnt/md0已安装文件,而不必安装它...
David L.

178

您不必费心提到O / S。

Ubuntu Linux 11.10(可能是最新版本的Linux)具有该mountpoint命令。

这是我的一台服务器上的示例:

$ 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

希望能有所帮助。


7
您实际上在运行“ mountpoint”命令时挂载了某些东西吗?即使打算将其用作安装点,除非它实际上已安装了某些东西,否则它只是一个目录。
Mark J. Bobak

2
+1,也可以在Ubuntu 10.10上使用。从8.04开始就在Ubuntu中
l0b0 2012年

3
mountpoint也存在于RHEL 6.3中(甚至在较早的版本中也是如此)
Joril

2
mountpoint存在并且可以完美地在Debian 7(“ Wheezy”)和UCS 4上工作
Lahmizzar

7
另一条评论中所述,mountpoint不适用于绑定安装。该代码段将多次挂载该目录
csanchez 2015年

40

的手册mountpoint说:

检查是否在/ proc / self / mountinfo文件中提到了给定的目录或文件。

的手册mount说:

维护列表模式仅是为了向后兼容。对于更健壮和可定制的输出,请使用findmnt(8),尤其是在脚本中。

因此,正确使用的命令是findmnt,它本身是util-linux软件包的一部分,并且根据手册:

能够在/ etc / fstab,/ etc / mtab或/ proc / self / mountinfo中搜索

因此,它实际上搜索的内容比还要多mountpoint。它还提供了方便的选项:

-M,--mountpoint 路径

明确定义安装点文件或目录。另请参阅--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"

2

我喜欢使用的答案/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

1
真可爱!正是你想要的一个小型的嵌入式系统中没有华丽的工具,如mountpointfindmnt存在。非常简单的答复,非常高兴,例如UNIX :)
troglobit

1

我的解决方案:

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的答案mountpoint如果bind在其他文件系统中使用选项挂载,则不起作用。

对于Christopher Neylan的答案,不需要将grep的输出重定向到/ dev / null,而只需使用grep -q

最重要的是,通过使用规范化路径readlink -f $mypath

  • 如果检查路径(例如/path/to/dir/以反斜杠结尾),则输入/proc/mountsmount输出为/path/to/dir
  • 在大多数Linux发行版,/var/run/是符号链接/run/,因此,如果您安装了绑定/var/run/mypath,并检查它是否安装,它会显示为/run/mypath/proc/mounts

2
我认为“ grep -q” $ path“ / proc / mounts”(带空格)甚至更好...否则,如果安装了abc,is_mount ab将返回true?
alfonx

0

另一个干净的解决方案是这样的:

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

可以肯定的是,“回声某事”可以用每种情况下需要做的任何事情代替。


这和@ChristopherNeylan的回答完全一样。
乔纳森H

0

这里的答案太复杂了,只需使用以下命令检查安装是否存在:

cat /proc/mounts | tail -n 1

如果您想查看所有文件夹,这仅输出最后一个安装的文件夹,只需删除tail命令。


-4

在我的.bashrc中,我做了以下别名:

alias disk-list="sudo fdisk -l"

该请求是关于脚本的,最好避免使用sudo和program来实现“操纵磁盘分区”的目标
bcag2
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.