linux 检查是否使用bash装载目录

uqzxnwby  于 2022-12-26  发布在  Linux
关注(0)|答案(8)|浏览(166)

我在用

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

我想用bash脚本检查一下/foo/bar,看看它是否已经挂载了?如果没有,就调用上面的mount命令,否则就做别的事情。我该怎么做呢?
CentOS是操作系统。

lsmepo6l

lsmepo6l1#

你都没提过操作系统。
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
mo49yndu

mo49yndu2#

运行不带参数的mount命令会告诉你当前的挂载点。在shell脚本中,你可以使用grep和一个if语句来检查挂载点:

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

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

pqwbnv8z

pqwbnv8z3#

mountpoint的手册上说:
检查/proc/self/mountinfo文件中是否提到给定的目录或文件。
mount的手册上说:
列表模式只是为了向后兼容而保留的。要获得更健壮和可定制的输出,请使用findmnt(8),尤其是在脚本中。
因此,正确的命令是findmnt,它本身是util-linux包的一部分,根据手册:
可以在/etc/fstab、/etc/mtab或/proc/self/mountinfo中进行搜索
所以它实际上比mountpoint搜索更多的东西,它还提供了方便的选项:

  • M,--装载点 * 路径 *
    显式定义挂载点文件或目录。另请参见--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"
lmvvr0a8

lmvvr0a84#

我的解决方案:

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,如果在不同的文件系统中使用bind选项装载,则mountpoint不起作用。
对于Christopher Neylan's answer,不需要将grep的输出重定向到/dev/null,只需使用grep -q即可。

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

  • 如果选中以反斜杠结尾的/path/to/dir/等路径,则/proc/mountsmount输出中的路径为/path/to/dir
  • 在大多数linux版本中,/var/run//run/的符号链接,所以如果你为/var/run/mypath挂载bind并检查它是否挂载,它将在/proc/mounts中显示为/run/mypath
628mspwn

628mspwn5#

我喜欢使用/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
pqwbnv8z

pqwbnv8z6#

这里的答案太复杂了,只需使用以下命令检查挂载是否存在:
第一个月
这只输出最后一个挂载的文件夹,如果你想看到所有的文件夹,只需删除tail命令。

v09wglhw

v09wglhw7#

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

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

当然,“echo something”可以用您需要为每个案例做的任何事情来代替。

j9per5c4

j9per5c48#

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

alias disk-list="sudo fdisk -l"

相关问题