После перезагрузки я запускаю приложение из подключенного сетевого ресурса (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