Crontab em execução antes da montagem do NFS


9

A execução de Cronjob @reboot retorna esse arquivo no compartilhamento nfs não existe.

Exemplo

@reboot python /abs/path/to/script.py

o correio do crontab na inicialização lê "mais ou menos"

/usr/bin/python can't open file "/abs/path/to/script.py": [Error No. 2] No such file or folder.

O script pode ser executado a partir da linha de comando sem problemas.
Teoria é que o cronjob está sendo executado antes da montagem ser executada.
As questões.

  1. Esta teoria está correta?
  2. Existe uma maneira de forçar o trabalho até que a unidade seja montada? .... Além de apenas colocar um sono 60 no comando. ;) Eu já tentei isso, mas é um sucesso e preciso do script para executar 100% do tempo rapidamente.

2
Que distribuição você está usando?
Sven

Respostas:


16

Você pode usar o comando mountpoint para garantir que a montagem ocorra antes de executar seu comando, por exemplo (assumindo / abs é o ponto de montagem)

#!/bin/bash
while true
do
    if mountpoint -q /abs
        then
            /usr/bin/python /abs/path/to/script.py
            break
        fi
    sleep 10
done

3
+1 que eu nunca ouvi falar mountpoint- isso é bastante útil!
Sven

@SvenW Mesmo aqui. Agora estou atualizando um punhado de scripts com isso.
Aaron Copley

Selecionar essa resposta como uma vez que, enquanto o sistema está sendo reinicializado, nem sabemos se o nic está pronto para montar o sistema e tentar montar o sistema de arquivos antes que o nic esteja pronto pode ser desastroso.
Rusty Weber

4

Não sei ao certo qual é o problema, pois o cron inicia após a rede. (Pelo menos no Red Hat e derivativos.) Suas montarias estão /etc/fstabcom _netdevopção ou então onde?

A maneira padrão de executar algo na inicialização é incluí-lo /etc/rc.local. Isso será executado depois que a rede for inicializada e todos os outros serviços forem iniciados. (Incluindo montagem de sistemas de arquivos remotos.)

(Ou existe um motivo para executar o script apenas após uma reinicialização literal?)


Sim, o compartilhamento é montado no fstab. Eu estava executando no ubuntu, o que significa que a rede pode não estar em execução. O etc / rc.local parece ser a melhor solução, mas se o @restart existir no crontab, a suposição é que ele funcione.
oxidada Weber

1

Aqui estão algumas idéias para você:

  1. verifique se o NFS está montado. Caso contrário, monte-o e execute seu script:

    [ ! -f /abs/path/to/script.py ] && mount -t nfs device dir && python /abs/path/to/script.py

  2. execute seu script na start()função do script init do NFS:

    echo -n $"Starting NFS mountd: "
    daemon rpc.mountd $RPCMOUNTDOPTS
    RETVAL=$?
    echo
    [ $RETVAL -ne 0 ] && exit $RETVAL || python /abs/path/to/script.py
    

1

Para ter certeza absoluta de que o script python é capaz de executar. Você precisaria envolvê-lo em um script armazenado no armazenamento local para verificar se o ponto de montagem subiu.

Algo como (pseudo código de aviso):

while (!ScriptExists && ErrorCount < 10)
do
    mount /my/mount/point
    sleep 10
    ErrorCount++
done
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.