在NFS挂载之前运行Crontab


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
您正在使用什么发行版?
斯文

Answers:


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

3
+1我从未听说过mountpoint-这非常有用!
斯文

@SvenW这里也是。我现在用这个来更新一些脚本。
亚伦·科普利2012年

之所以选择此问题作为答案,因为在系统重新引导时,我们甚至都不知道nic是否已准备好安装系统,并且在nic准备就绪之前尝试安装文件系统可能会造成灾难性的后果。
Rusty Weber

4

我不确定问题出在哪里,因为cron在联网后就启动了。(至少在Red Hat及其衍生产品中。)您的安装位置是否/etc/fstab带有_netdevoption或其他位置?

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

(或者有没有理由在字面量重启后才执行脚本?)


是的,共享已安装在fstab中。我在ubuntu中运行,这意味着网络可能尚未运行。etc / rc.local确实是最好的解决方案,但是如果crontab中存在@restart,则认为它应该可以工作。
Rusty Weber

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.