Como detectar se o ponto de montagem existe do script init.d?

4

Após a reinicialização, estou executando um aplicativo de um compartilhamento de rede montado (autofs) usando um script init.d. O script começa aguardando 30 segundos antes de tentar executar o comando, a fim de aguardar que a rede / ponto de montagem esteja ativo.

Eu gostaria de detectar de alguma forma que a rede está definitivamente ativa e a montagem foi montada definitivamente, antes de executar o comando.

Qual é a sua recomendação sobre como conseguir isso (no CentOS 6.4) com este script?

Isso é o que eu tenho agora:

#!/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
    
por fredrik 03.11.2013 / 11:12

2 respostas

9
Os scripts

init são iniciados na ordem definida pelos números S ##. Versões mais recentes do Unix (pelo menos no Linux) iniciam os mesmos números ## em paralelo (embora você possa desativar esse recurso ...) Tudo o que você precisa fazer é usar um ## que seja após a rede e fsmount number. Então deve funcionar. No entanto, se o fsmount iniciar em segundo plano, o mais fácil provavelmente será investigar os arquivos na unidade montada. Algo parecido com isto:

while ! test -f /mnt/over-there/this/file/here
do
    sleep 1
done

Isso irá esperar até o arquivo aparecer. Se ainda não estiver lá, durma um segundo e tente novamente.

Para evitar o possível problema de alguém criar o arquivo que você está testando no computador local, você pode usar a linha de comando mountpoint como em:

while ! mountpoint -q /mnt/over-there
do
    sleep 1
done

(Do comentário abaixo.) O -q é para tornar o comando silencioso.

--- Atualização: tempo limite após 30 tentativas

No script de shell, você também pode contar e testar números:

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

Isso será interrompido se a contagem atingir 30 (30 segundos de suspensão mais o tempo necessário para verificar se o arquivo está disponível ou não), após o qual será impressa a mensagem de erro "esgotado!".

--- Atualização: no caso de você mudar para o systemd

Com o systemd, a seção Unidade suporta:

ConditionPathIsMountPoint=/mnt/over-there

que faz a mesma coisa que o script acima, sem o tempo limite. Esta declaração evita iniciar seu comando até que a montagem exista.

    
por 03.11.2013 / 11:18
5

Como o diretório de destino pode estar presente, mas não montado, prefiro o teste simonpw em / proc / montagens

if ! grep -qs '/the/mounted/dir' /proc/mounts; then
    
por 12.11.2014 / 14:07