Crontab en cours d'exécution avant le montage de nfs

9

L'exécution de Cronjob @reboot renvoie que le fichier sur le partage nfs n'existe pas.

Exemple

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

le courrier de crontab au démarrage indique "plus ou moins"

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

Le script peut être exécuté à partir de la ligne de commande sans problème. La
théorie est que le cronjob est en cours d'exécution avant l'exécution du montage.
Questions.

  1. Cette théorie est-elle correcte?
  2. Existe-t-il un moyen de forcer le travail à se lamenter jusqu'à ce que le lecteur soit monté? .... Autre que de simplement mettre un sommeil 60 dans la commande. ;) J'ai déjà essayé ça, mais c'est hasardeux et j'ai besoin que le script s'exécute 100% du temps rapidement.
Rusty Weber
la source
2
Quelle distribution utilisez-vous?
Sven

Réponses:

16

Vous pouvez utiliser la commande mountpoint pour vous assurer que le montage a eu lieu avant d'exécuter votre commande, par exemple (en supposant que / abs est le point de montage)

#!/bin/bash
while true
do
    if mountpoint -q /abs
        then
            /usr/bin/python /abs/path/to/script.py
            break
        fi
    sleep 10
done
user9517
la source
3
+1 dont je n'ai jamais entendu parler mountpoint- c'est très utile!
Sven
@SvenW Idem ici. Je mets maintenant à jour une poignée de scripts avec cela.
Aaron Copley,
Sélectionner cela comme réponse car pendant le redémarrage du système, nous ne savons même pas si le nic est prêt à monter le système et tenter de monter le système de fichiers avant que le nic ne soit prêt peut être désastreux.
Rusty Weber
4

Je ne sais pas quel est le problème puisque cron démarre après la mise en réseau. (Au moins dans Red Hat et ses dérivés.) Vos montures sont-elles /etc/fstabavec _netdevoption ou ailleurs?

La manière standard d'exécuter quelque chose au démarrage est de l'inclure dans /etc/rc.local. Celui-ci sera exécuté une fois le réseau initialisé et tous les autres services démarrés. (Y compris le montage de systèmes de fichiers distants.)

(Ou existe-t-il une raison pour exécuter le script uniquement après un redémarrage littéral?)

Aaron Copley
la source
Oui, le partage est monté dans fstab. Je courais dans ubuntu, ce qui signifie que le réseau ne fonctionnait peut-être pas. etc / rc.local semble être la meilleure solution, mais si @restart existe dans crontab, l'hypothèse est que cela devrait fonctionner.
Rusty Weber
1

Voici quelques idées pour vous:

  1. vérifiez si NFS est monté. Sinon, montez-le, puis exécutez votre script:

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

  2. exécutez votre script dans la start()fonction du script d'initialisation NFS:

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

Pour être absolument sûr que le script python est capable de s'exécuter. Vous devrez l'envelopper dans un script stocké sur le stockage local pour vérifier que le point de montage est arrivé.

Quelque chose comme (pseudo-code d'avertissement):

while (!ScriptExists && ErrorCount < 10)
do
    mount /my/mount/point
    sleep 10
    ErrorCount++
done
Zypher
la source