我正在尝试编写一个可以部署在许多不同的 Linux 服务器上的备份脚本,其中一些服务器按照 /etc/fstab 中的描述安装网络驱动器。我希望我的脚本能够查看在备份之前是否有任何网络驱动器被卸载,以确保它们不会被保存。有没有办法在 bash 脚本中可靠地检查这一点?
答案1
我想到的一个方法是遍历挂载点列表,看看每个挂载点下有多少个文件。值为 1 可能意味着文件系统未挂载(只有目录本身存在)。但是,如果挂载点是嵌套的,则此策略不起作用。我所说的“嵌套”是指以下挂载点:
/mnt/server1/share1
/mnt/server1/share1/share2
/mnt/server1/share1/share2/share3
我还看到过这种情况,当某人/某个进程不知道那里没有挂载,还是将文件复制到那里,而文件被写入底层文件系统,而不是应该挂载在那里的文件系统时,这种情况会失败。
但如果你的结构更“扁平”(或者如果它可以制成平坦(用于备份目的),例如:
/mnt/server1/share1
/mnt/server1/share2
/mnt/server2/share3
然后:
MNTS="/mnt/server1/share1 /mnt/server1/share2 /mnt/server2/share3"
for DIR in $MNTS; do
N=$(find $DIR | head -10 | wc -l)
if [ $N -eq 1 ]; then
print "%s appears to not be mounted\n" "$DIR"
else
# back it up
fi
done
另一种方法可能与操作系统略有关系,或者至少在mount
的输出格式发生变化时可能会发生变化,即对 的输出进行强力检查mount
。假设您mount
始终使用空格,从不使用制表符,那么:
MNTS="/mnt/server1/share1 /mnt/server1/share2 /mnt/server2/share3"
for DIR in $MNTS; do
if ! mount | grep -F " $DIR "; then
print "%s appears to not be mounted\n" "$DIR"
else
# back it up
fi
done
答案2
test
将命令与标志结合起来-d
,检查挂载是否存在问题:
#!/bin/bash
mount="/fileserver"
if mountpoint -q "$mount" && test -d /path/to/share; then
cp -ru /path/to/files /. -t /path/to/share
fi
根据迈克尔·汉普顿的评论进行编辑。