Crontab ejecutándose antes de que se montara nfs

9

La ejecución de Cronjob @reboot devuelve que el archivo en nfs share no existe.

Ejemplo

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

el correo de crontab en el inicio dice "más o menos"

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

El script se puede ejecutar desde la línea de comandos sin problemas. La
teoría es que el cronjob se está ejecutando antes de que se haya ejecutado el montaje.
Las preguntas.

  1. ¿Es correcta esta teoría?
  2. ¿Hay alguna forma de obligar al trabajo a llorar hasta que se haya montado la unidad? .... Aparte de simplemente dormir 60 en el comando. ;) Ya lo intenté, pero es impredecible y necesito que el script se ejecute el 100% del tiempo rápidamente.
Weber oxidado
fuente
2
¿Qué distribución estás usando?
Sven

Respuestas:

16

Puede usar el comando mountpoint para asegurarse de que el montaje se haya realizado antes de ejecutar su comando, por ejemplo (suponiendo que / abs es el punto de montaje)

#!/bin/bash
while true
do
    if mountpoint -q /abs
        then
            /usr/bin/python /abs/path/to/script.py
            break
        fi
    sleep 10
done
usuario9517
fuente
3
+1 Nunca he oído hablar de mountpointesto, ¡esto es bastante útil!
Sven
@SvenW Lo mismo aquí. Ahora estoy actualizando un puñado de scripts con esto.
Aaron Copley
Al seleccionar esto como la respuesta, ya que mientras el sistema se reinicia, ni siquiera sabemos si el nic está listo para montar el sistema e intentar montar el sistema de archivos antes de que el nic esté listo puede ser desastroso.
Rusty Weber
4

No estoy seguro de cuál es el problema ya que cron comienza después de la conexión en red. (Al menos en Red Hat y derivados). ¿Están sus monturas /etc/fstabcon _netdevopción o, de lo contrario, dónde?

La forma estándar de ejecutar algo al inicio es incluirlo /etc/rc.local. Esto se ejecutará después de que se inicialice la red y se inicien todos los demás servicios. (Incluyendo el montaje de sistemas de archivos remotos).

(¿O hay una razón para ejecutar solo el script después de un reinicio literal?)

Aaron Copley
fuente
Sí, el recurso compartido está montado en fstab. Estaba corriendo en ubuntu, lo que significa que la red puede no haber estado corriendo. etc / rc.local parece ser la mejor solución, pero si @restart existe en crontab, se supone que debería funcionar.
Rusty Weber
1

Aquí hay algunas ideas para ti:

  1. compruebe si NFS está montado. Si no, móntelo, luego ejecute su script:

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

  2. ejecute su script en la start()función del script de inicio NFS:

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

Para estar absolutamente seguro de que el script de Python puede ejecutarse. Debería envolverlo en una secuencia de comandos almacenada en el almacenamiento local para verificar que el punto de montaje ha surgido.

Algo como (pseudocódigo de advertencia):

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