Назад | Перейти на главную страницу

Как определить, существует ли точка монтирования из сценария init.d?

После перезагрузки я запускаю приложение из подключенного сетевого ресурса (autofs) с помощью сценария init.d. Сценарий запускается с ожидания 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 попыток

В сценарии оболочки вы также можете подсчитывать и проверять числа:

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

который делает то же самое, что и приведенный выше скрипт, без тайм-аута. Этот оператор предотвращает запуск вашей команды до тех пор, пока не будет установлено монтирование.

Поскольку целевой каталог может присутствовать, но не монтироваться, я предпочитаю Simonpw тест на / proc / mounts

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