确保在执行备份之前已安装网络驱动器

确保在执行备份之前已安装网络驱动器

我正在尝试编写一个可以部署在许多不同的 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

根据迈克尔·汉普顿的评论进行编辑。

相关内容