Linux

如何從 init.d 腳本中檢測掛載點是否存在?

  • November 7, 2016

重新啟動後,我正在使用 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 秒的睡眠加上檢查文件是否可用所需的時間),這將停止,之後它會列印錯誤消息“超時!”。

更新:如果你要切換到 systemd

使用 systemd,Unit 部分支持:

ConditionPathIsMountPoint=/mnt/over-there

它與上面的腳本做同樣的事情,沒有超時。在掛載存在之前,此語句會阻止啟動您的命令。

引用自:https://serverfault.com/questions/550382