Crontab работает до монтирования nfs

9

Запуск Cronjob @reboot возвращает, что файл на общем ресурсе nfs не существует.

пример

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

почта из crontab при запуске читает "более или менее"

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

Скрипт может быть запущен из командной строки без проблем.
Теория заключается в том, что cronjob запускается до запуска mount.
Вопросы.

  1. Эта теория верна?
  2. Есть ли способ заставить работу плакать, пока диск не будет смонтирован? .... За исключением простого сна 60 в команду. ;) Я уже пробовал это, но это попало, и мне нужно, чтобы скрипт работал 100% времени быстро.
Расти Вебер
источник
2
Какой дистрибутив вы используете?
Свен

Ответы:

16

Вы можете использовать команду mountpoint, чтобы убедиться, что монтирование было выполнено до выполнения вашей команды, например (при условии, что / abs является точкой монтирования)

#!/bin/bash
while true
do
    if mountpoint -q /abs
        then
            /usr/bin/python /abs/path/to/script.py
            break
        fi
    sleep 10
done
user9517
источник
3
+1 Я никогда не слышал mountpoint- это очень полезно!
Свен
@SvenW То же самое здесь. Я сейчас обновляю несколько скриптов с этим.
Аарон Копли
Выбрав это в качестве ответа, так как пока система перезагружается, мы даже не знаем, готов ли процесс монтировать систему, и попытка монтировать файловую систему до того, как этот процесс будет готов, может иметь катастрофические последствия.
Расти Вебер
4

Я не уверен, в чем проблема, поскольку cron запускается после работы в сети. (По крайней мере, в Red Hat и ее производных.) Ваши монтирует /etc/fstabс _netdevопцией или еще где?

Стандартный способ выполнения чего-либо при запуске состоит в том, чтобы включить это в /etc/rc.local. Это будет выполнено после инициализации сети и запуска всех других служб. (Включая монтирование удаленных файловых систем.)

(Или есть причина выполнять скрипт только после буквальной перезагрузки?)

Аарон Копли
источник
Да, доля смонтирована в fstab. Я работал в Ubuntu, что означает, что сеть, возможно, не работала. etc / rc.local кажется лучшим решением, но если @restart существует в crontab, предполагается, что он должен работать.
Расти Вебер
1

Вот несколько идей для вас:

  1. проверьте, смонтирован ли NFS. Если нет, смонтируйте его, затем запустите ваш скрипт:

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

  2. запустите ваш скрипт в start()функции сценария инициализации NFS:

    echo -n $"Starting NFS mountd: "
    daemon rpc.mountd $RPCMOUNTDOPTS
    RETVAL=$?
    echo
    [ $RETVAL -ne 0 ] && exit $RETVAL || python /abs/path/to/script.py
    
кванты
источник
1

Чтобы быть абсолютно уверенным, что скрипт python способен работать. Вам нужно будет обернуть его в сценарий, хранящийся в локальном хранилище, чтобы убедиться, что точка монтирования подошла.

Что-то вроде (предупреждающий псевдокод):

while (!ScriptExists && ErrorCount < 10)
do
    mount /my/mount/point
    sleep 10
    ErrorCount++
done
Zypher
источник