在 nfs 挂载之前运行 Crontab

在 nfs 挂载之前运行 Crontab

运行 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. 有没有办法强制作业运行直到驱动器安装完成?......除了在命令中输入 sleep 60 之外。;) 我已经尝试过了,但是它时好时坏,我需要脚本能够快速运行 100% 的时间。

答案1

您可以使用挂载点命令以确保在执行命令之前已完成挂载,例如(假设 /abs 是挂载点)

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

答案2

我不确定问题是什么,因为 cron 在联网后启动。(至少在 Red Hat 和衍生产品中。)您的挂载是在/etc/fstab选项中_netdev还是在其他地方?

在启动时执行某些操作的标准方法是将其包含在内/etc/rc.local。这将在网络初始化和所有其他服务启动后运行。(包括安装远程文件系统。)

(或者是否有理由仅在重新启动后执行脚本?)

答案3

以下是一些建议:

  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
    

答案4

要绝对确保 Python 脚本能够运行。您需要将其包装在本地存储中的脚本中,以验证挂载点是否已出现。

类似于(警告伪代码):

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

相关内容