sh脚本:如何挂载远程文件系统,如果没有挂载?

在bourne shell脚本(#!/ bin / sh)中,如何检查远程NFS共享是否被挂载,如果不是,挂载它? 我目前有一套丑陋的猫,greps和ifs使用“mount”的输出,但它似乎没有做一个可靠的工作。

如果可能的话,设置自动挂载(autofs)将是执行此操作的标准方法。 它可能已经在你的发行版中(附带CentOS / Redhat默认安装)。 这是一个教程 。

为什么使用Automount?

自动挂载是由守护进程自动挂载和卸载某些文件系统的过程。 如果文件系统被卸载,并且用户试图访问它,它将被自动(重新)挂载。 这在大型networking环境中和在几台机器(特别是不总是在线的机器)之间交叉安装文件系统尤其有用。

你可以grep /etc/mtab的设备? grep -c '/mnt/foo' /etc/mtab如果grep输出'1'则挂载/ mnt / foo。

使用安装mountpoint

 mountpoint -q /path/to/nfs/share || mount -t nfs server:/nfs/share /path/to/nfs/share 

(我不知道有多广泛或可移植的mountpoint ,它是由Debian服务器上的initscripts软件包提供的。)

在solaris

如果您检查脚本正在运行的系统是否安装了远程文件系统

 ISMOUNTED=`/usr/sbin/mount | grep "^/path/to/mount "` if [ "$ISMOUNTED" = "" ] then mountcommand* fi 

如果/ etc / vfstab或/ usr / sbin / mount远程主机中有相应的条目,则mountcommand可以是/ usr / sbin / mount / path / to / mount:/ remote / path / path / to / mount

你可以用stat来做一些事情。 “设备”字段在不同的文件系统中是不同的。 因此,假设你想看看/mnt/foo是否被挂载,你可以比较stat -c%d /mnt/stat -c%d /mnt/foo/ 。 如果设备不同,则在那里安装一些东西。

 if [ `stat -c%d /mnt/` -eq `stat -c%d /mnt/foo/` ]; then mount /mnt/foo fi 

当涉及到它时,shell编程就是将使用pipe道的小型分立工具连接起来,以生成某种复合工具。 一个以“聪明”的方式做你所要求的工具并不能真正符合Unix的哲学。

如果你想更智能地做到这一点,你可能想要看看Perl或Python或C,在那里你可以使用库函数与portmapper交谈,以获取有关装入的文件系统作为数据结构的信息。 然后,您可以智能地执行任务,将当前状态更改为您想要的状态。

只是为了抛出另一个想法,df命令可以告诉你一个目录的挂载文件系统。 如果你抛出-l选项,你会得到一个非常简单的testing,看看目录是否在本地文件系统上。

$ cd /net/remoteshare
$ df -l .
df: no file systems processed
$ echo $?
1

几点build议:

  • 如果您的发行版有一个RC脚本来处理NFS挂载,那么使用它或审查它的状态将是谨慎的。 如果您错误地认为portmapstatd等服务已经启动,您可能会遇到麻烦。

  • 使用/proc/mounts来支持mount的输出或者/etc/mtab的可能过时的内容通常更可靠。

  • 使用grep -qs并检查返回代码以确定是否存在挂载。

  • 假设/etc/fstab列出的所有NFS挂载都应该挂载,那么可以通过mount -a -t nfs,nfs4来挂载它们。 任何已经安装的将被忽略。

 #!/bin/bash mountpoint='your mountpoint' mobileno="" smsurl="" mntcmd='/bin/mount -a' mntchkcmd='/bin/mount' ###Check mount point available or not IF not alert to service own ${mntchkcmd} | /bin/grep ${mountpoint} > /dev/null 2>&1 if [ $? != 0 ] then ${mntcmd} sleep 5 ${mntchkcmd} | /bin/grep ${mountpoint} > /dev/null 2>&1 if [ $? != 0 ] then echo "issue with mount point" exit fi fi ###If mount point is available then check it for utilisation. warn=90 critical=95 disksize=$(/bin/df -k ${mountpoint} | /bin/grep ${mountpoint} | /bin/awk -F% '{print $1}' | /bin/awk '{print $4}') if [ ${disksize} -gt ${warn} ] then echo 'warn' elif [ ${disksize} -gt ${critical} ] then echo 'critical' fi