fre*_*rik 4 linux bash rhel6 centos6.4
重新启动后,我使用 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
Run Code Online (Sandbox Code Playgroud)
init脚本按 S## 编号定义的顺序启动。较新版本的 Unix(至少在 Linux 上)并行启动相同的 ## 数字(尽管您可以关闭该功能......)所有您必须使用网络和fsmount数字之后的## 。那么它应该工作。但是,如果fsmount在后台启动,最简单的方法可能是探测已安装驱动器上的文件。像这样的东西:
while ! test -f /mnt/over-there/this/file/here
do
sleep 1
done
Run Code Online (Sandbox Code Playgroud)
这将等到文件出现。如果还没有,请稍等片刻,然后再试一次。
为了避免有人在本地计算机上创建您正在测试的文件的潜在问题,您可能希望使用mountpoint命令行,如下所示:
while ! mountpoint -q /mnt/over-there
do
sleep 1
done
Run Code Online (Sandbox Code Playgroud)
(来自下面的评论。)这-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
Run Code Online (Sandbox Code Playgroud)
如果计数达到 30(30 秒睡眠加上检查文件是否可用所需的时间),它将停止,之后它会打印错误消息“超时!”。
---更新:如果您要切换到 systemd
使用 systemd,Unit 部分支持:
ConditionPathIsMountPoint=/mnt/over-there
Run Code Online (Sandbox Code Playgroud)
它与上面的脚本做同样的事情,没有超时。此语句防止在安装存在之前启动您的命令。
小智 5
因为目标目录可以存在但不能挂载,我更喜欢/proc/mounts 上的simonpw测试
if ! grep -qs '/the/mounted/dir' /proc/mounts; then
Run Code Online (Sandbox Code Playgroud)