web-dev-qa-db-ja.com

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
4
fredrik

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回の試行後のタイムアウト

シェルスクリプトでは、数値をカウントしてテストすることもできます。

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

上記のスクリプトと同じことを行いますが、タイムアウトはありません。このステートメントは、マウントが存在するまでコマンドを開始しないようにします。

9
Alexis Wilke

宛先ディレクトリは存在する可能性がありますがマウントされないため、私は simonpw /proc/mountsでテストすることをお勧めします

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