sh scripting: como montar um sistema de arquivos remoto se ele não estiver montado?

3

Em um script de shell bourne (#! / bin / sh) como verificar se um compartilhamento NFS remoto está montado e, se não estiver, monte-o? Eu tenho um conjunto feio de gato, greps e ifs usando a saída de 'mount' no momento, mas não parece estar fazendo um trabalho confiável.

    
por DrStalker 15.07.2009 / 08:20

9 respostas

5

Se possível, configurar a montagem automática (autofs) seria a maneira padrão de fazer isso. Pode já estar na sua distribuição (vem com a instalação padrão do CentOS / Redhat). Aqui está um tutorial .

Por que usar o Automount?

Automounting is the process where mounting and unmounting of certain filesystems is done automatically by a daemon. If the filesystem is unmounted, and a user attempts to access it, it will be automatically (re)mounted. This is especially useful in large networked environments and for crossmounting filesystems between a few machines (especially ones which are not always online).

    
por 15.07.2009 / 13:30
3

Você pode grep /etc/mtab para o dispositivo? grep -c '/mnt/foo' /etc/mtab se o grep emitir '1' e então / mnt / foo estiver montado.

    
por 15.07.2009 / 08:47
3

Use mountpoint .

mountpoint -q /path/to/nfs/share || mount -t nfs server:/nfs/share /path/to/nfs/share

(Eu não sei qual é o generalizado ou portátil mountpoint ; ele é fornecido pelo pacote initscripts no meu servidor Debian.)

    
por 15.07.2009 / 14:45
2

No solaris

Se você verificar que o sistema em que o script está sendo executado tem um sistema de arquivos remoto montado, então

ISMOUNTED='/usr/sbin/mount | grep "^/path/to/mount "'
if [ "$ISMOUNTED" = "" ]
then
    mountcommand*
fi

* mountcommand pode ser / usr / sbin / mount / caminho / para / mount se houver uma entrada correspondente no / etc / vfstab ou / usr / sbin / mount remotehost: / remote / caminho / caminho / para / mount

    
por 15.07.2009 / 14:14
1

Você pode fazer algo com stat. O campo "dispositivo" será diferente em diferentes sistemas de arquivos. Portanto, supondo que você queira ver se /mnt/foo está montado, compare a saída de stat -c%d /mnt/ a stat -c%d /mnt/foo/ . Se o dispositivo for diferente, algo é montado lá.

if [ 'stat -c%d /mnt/' -eq 'stat -c%d /mnt/foo/' ]; then
    mount /mnt/foo
fi
    
por 15.07.2009 / 08:37
1

Quando se trata disso, a programação de shell envolve conectar pequenas ferramentas discretas usando pipes para produzir algum tipo de utilitário composto. Um utilitário que fez o que você está pedindo de uma maneira "inteligente" não corresponde realmente à filosofia Unix.

Se você quiser fazê-lo de maneira mais inteligente, você pode querer fazer isso em Perl ou Python ou C, onde você pode usar as funções da biblioteca para conversar com o portmapper para obter informações sobre sistemas de arquivos montados como uma estrutura de dados. Você pode, então, executar as tarefas de maneira inteligente para alterar o estado atual para o estado desejado.

    
por 15.07.2009 / 10:15
1

Apenas para lançar uma outra idéia por aí, o comando df pode informar o sistema de arquivos montado de um diretório. Se você colocar a opção -l , você obterá um teste bastante fácil para ver se um diretório está ou não em um sistema de arquivos local.

$ cd /net/remoteshare
$ df -l .
df: no file systems processed
$ echo $?
1

    
por 15.07.2009 / 15:30
0

Algumas sugestões:

  • Se sua distribuição tiver um script RC para manipular montagens NFS, seria prudente usar ou verificar seu status. Você pode ter problemas se assumir incorretamente que serviços como portmap e statd já foram iniciados.

  • Geralmente, é mais confiável usar /proc/mounts em favor da saída de mount ou do conteúdo possivelmente desatualizado de /etc/mtab .

  • Use grep -qs e verifique o código de retorno para determinar se uma montagem está presente ou não.

  • Supondo que todas as montagens NFS listadas em /etc/fstab devem ser montadas, você pode montá-las universalmente com mount -a -t nfs,nfs4 . Qualquer coisa já montada será ignorada.

por 15.07.2009 / 10:37
0
#!/bin/bash
mountpoint='your mountpoint'
mobileno=""
smsurl=""
mntcmd='/bin/mount -a'
mntchkcmd='/bin/mount'   
###Check mount point available or not IF not alert to service own
${mntchkcmd} | /bin/grep ${mountpoint} > /dev/null 2>&1
if [ $? != 0 ]
        then
    ${mntcmd}
    sleep 5
    ${mntchkcmd} | /bin/grep ${mountpoint} > /dev/null 2>&1
    if [ $? != 0 ]
        then
        echo "issue with mount point"
        exit
    fi
fi
###If mount point is available then check it for utilisation.
warn=90
critical=95
disksize=$(/bin/df -k ${mountpoint} | /bin/grep ${mountpoint} | /bin/awk -F% '{print $1}' | /bin/awk '{print $4}')
if [ ${disksize} -gt ${warn} ]
    then
        echo 'warn'
    elif [ ${disksize} -gt ${critical} ] 
    then
        echo 'critical' 
fi
    
por 23.09.2011 / 13:08