Linux
如何從 init.d 腳本中檢測掛載點是否存在?
重新啟動後,我正在使用 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
它與上面的腳本做同樣的事情,沒有超時。在掛載存在之前,此語句會阻止啟動您的命令。