Crontab wird ausgeführt, bevor nfs bereitgestellt wird

9

Wenn Sie Cronjob @reboot ausführen, wird zurückgegeben, dass die Datei auf der NFS-Freigabe nicht vorhanden ist.

Beispiel

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

E-Mail von crontab beim Start lautet "mehr oder weniger"

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

Das Skript kann problemlos über die Befehlszeile ausgeführt werden. Die
Theorie besagt, dass der Cronjob ausgeführt wird, bevor der Mount ausgeführt wurde.
Die Fragen.

  1. Ist diese Theorie richtig?
  2. Gibt es eine Möglichkeit, den Job zum Heulen zu zwingen, bis das Laufwerk montiert wurde? .... außer nur einen Schlaf 60 in den Befehl zu setzen. ;) Ich habe das schon versucht, aber es ist ein Hit und Miss und ich brauche das Skript, um 100% der Zeit schnell zu laufen.
Rusty Weber
quelle
2
Welche Distribution verwenden Sie?
Sven

Antworten:

16

Sie können den Befehl mountpoint verwenden, um sicherzustellen, dass die Bereitstellung stattgefunden hat, bevor Sie Ihren Befehl ausführen, z. B. (vorausgesetzt, / abs ist der Bereitstellungspunkt).

#!/bin/bash
while true
do
    if mountpoint -q /abs
        then
            /usr/bin/python /abs/path/to/script.py
            break
        fi
    sleep 10
done
user9517
quelle
3
+1 Ich habe noch nie davon gehört mountpoint- das ist sehr nützlich!
Sven
@SvenW Gleich hier. Ich aktualisiere jetzt eine Handvoll Skripte damit.
Aaron Copley
Wenn Sie dies als Antwort auswählen, da während des Neustarts des Systems nicht einmal bekannt ist, ob die Netzwerkkarte bereit ist, das System bereitzustellen, und der Versuch, das Dateisystem bereitzustellen, bevor die Netzwerkkarte bereit ist, kann katastrophal sein.
Rusty Weber
4

Ich bin mir nicht sicher, wo das Problem liegt, da cron nach dem Networking startet. (Zumindest in Red Hat und Derivaten.) Sind Ihre Reittiere /etc/fstabmit _netdevOption oder wo?

Die Standardmethode, um etwas beim Start auszuführen, besteht darin, es in aufzunehmen /etc/rc.local. Dies wird ausgeführt, nachdem das Netzwerk initialisiert und alle anderen Dienste gestartet wurden. (Einschließlich der Montage von Remote-Dateisystemen.)

(Oder gibt es einen Grund, das Skript erst nach einem wörtlichen Neustart auszuführen?)

Aaron Copley
quelle
Ja, die Freigabe wird in fstab bereitgestellt. Ich habe in Ubuntu ausgeführt, was bedeutet, dass das Netzwerk möglicherweise nicht ausgeführt wurde. etc / rc.local scheint die beste Lösung zu sein, aber wenn @restart in crontab vorhanden ist, wird davon ausgegangen, dass es funktionieren sollte.
Rusty Weber
1

Hier sind einige Ideen für Sie:

  1. Überprüfen Sie, ob NFS bereitgestellt ist. Wenn nicht, mounten Sie es und führen Sie Ihr Skript aus:

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

  2. Führen Sie Ihr Skript in der start()Funktion des NFS-Init-Skripts aus:

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

Um absolut sicher zu sein, dass das Python-Skript ausgeführt werden kann. Sie müssten es in ein Skript einschließen, das im lokalen Speicher gespeichert ist, um zu überprüfen, ob der Einhängepunkt erreicht wurde.

So etwas wie (Warnung Pseudo-Code):

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