重启后,我正在使用init.d脚本从已挂载的网络共享(autofs)执行应用程序.脚本在尝试执行命令之前等待30秒,以等待网络/挂载点启动.
在执行命令之前,我想以某种方式检测到网络确定已启动且安装已明确安装.
您对如何使用此脚本实现此目的(在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 ##数字定义的顺序启动.较新版本的Unix(至少在Linux上)并行启动相同的##数字(虽然您可以关闭该功能…)所有必须使用的##位于网络和fsmount编号之后.然后它应该工作.但是,如果fsmount在后台启动,最简单的可能是探测已安装驱动器上的文件.像这样的东西:
while ! test -f /mnt/over-there/this/file/here do sleep 1 done
这将等到文件出现.如果还没有,请睡一会儿然后再试一次.
为避免某人创建您在本地计算机上测试的文件的潜在问题,您可能希望使用mountpoint命令行,如:
while ! mountpoint -q /mnt/over-there do sleep 1 done
(来自下面的评论.)-q是使命令安静.
—更新:30次尝试后超时
在shell脚本中,您还可以计算和测试数字:
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秒的睡眠加上检查文件是否可用所需的时间),这将停止,之后它会输出错误消息“timed out!”.
—更新:如果你要切换到systemd
使用systemd,Unit section支持:
ConditionPathIsMountPoint=/mnt/over-there
它与上面的脚本完全相同,没有超时.此语句阻止在装入存在之前启动命令.