如何从init.d脚本检测挂载点是否存在?

重新启动后,我使用init.d脚本从挂载的networking共享(autofs)执行应用程序。 该脚本在尝试执行命令之前等待30秒,以等待networking/挂载点处于启动状态。

在执行命令之前,我想以某种方式检测networking是否已经完全挂起,挂载是否已经确定挂载。

你有什么build议如何用这个脚本实现这个(在CentOS 6.4中)?

这是我现在所拥有的:

#!/bin/bash # # chkconfig: 3 95 5 # description: My app # processname: my-app # # Sleep for 30 seconds before attempting to execute command sleep 30s # Get function from functions library . /etc/init.d/functions # Start the service my-app from autofs mount start() { echo -n "Starting my-app: " /share/path/my-app --log /tmp/log.log --supersede ### Create the lock file ### touch /var/lock/subsys/my-app success $"my-app startup" echo } # Restart the service my-app stop() { echo -n "Stopping my-app: " killproc my-app ### Now, delete the lock file ### rm -f /var/lock/subsys/my-app echo } ### main logic ### case "$1" in start) start ;; stop) stop ;; status) status my-app ;; restart|reload|condrestart) stop start ;; *) echo $"Usage: $0 {start|stop|restart|reload|status}" exit 1 esac exit 0 

init脚本按照S ## numbers定义的顺序启动。 Unix的更新版本(至less在Linux上)并行地启动相同的##号码(尽pipe你可以closures该function…)所有你需要做的是使用一个##,它位于networking和fsmount号码之后。 那么它应该工作。 但是,如果fsmount在后台启动,最容易的可能是探测装入驱动器上的文件。 像这样的东西:

 while ! test -f /mnt/over-there/this/file/here do sleep 1 done 

这将等到文件出现。 如果还没有,睡一会再试一次。

为了避免某人在本地计算机上创build文件的潜在问题,您可以改为使用mountpoint命令行,如下所示:

 while ! mountpoint -q /mnt/over-there do sleep 1 done 

(从下面的注释。)- -q是使命令安静。

更新:尝试30次后超时

在shell脚本中,您还可以计算和testing数字:

 count=0 while ! test -f /mnt/over-there/this/file/here do sleep 1 count=`expr $count + 1` if test $count -eq 30 then echo "timed out!" exit 1 fi done 

如果计数达到30(睡眠30秒加上检查文件是否可用的时间),这将停止,然后打印错误消息“超时!”。

更新:如果你要切换到systemd

在systemd中, 单元部分支持:

 ConditionPathIsMountPoint=/mnt/over-there 

它与上面的脚本做同样的事情,没有超时。 这个语句可以防止启动你的命令,直到挂载存在。

由于目标目录可以存在,但未挂载,所以我更喜欢/ proc / mounts上的simonpwtesting

 if ! grep -qs '/the/mounted/dir' /proc/mounts; then