网络启动时如何运行 cron 作业?

网络启动时如何运行 cron 作业?

我有一些每天运行的 anacron 作业。这些脚本会更新本地 bzr 和 git 存储库。这些脚本自然需要有效的网络连接。我使用的是笔记本电脑,有线和无线互联网通常都不够快。这导致我的 cron 作业在提取存储库时超时 =(

所以:

如何确保在运行特定的 cron 任务之前互联网已打开?或者,如果没有网络,如何让任务失败,以便稍后由 anacron 重试?

答案1

我制定了一个 cron 计划,对 DNS 服务器进行 ping 测试以确保网络连接。如下所示:

ping 8.8.8.8 -c 1 -i .2 -t 60 > /dev/null 2>&1
ONLINE=$?

if [ ONLINE -eq 0 ]; then
    #We're offline
else
    #We're online
fi

最近我用过这样的东西:

#!/bin/bash

function check_online
{
    netcat -z -w 5 8.8.8.8 53 && echo 1 || echo 0
}

# Initial check to see if we are online
IS_ONLINE=check_online
# How many times we should check if we're online - this prevents infinite looping
MAX_CHECKS=5
# Initial starting value for checks
CHECKS=0

# Loop while we're not online.
while [ $IS_ONLINE -eq 0 ]; do
    # We're offline. Sleep for a bit, then check again

    sleep 10;
    IS_ONLINE=check_online

    CHECKS=$[ $CHECKS + 1 ]
    if [ $CHECKS -gt $MAX_CHECKS ]; then
        break
    fi
done

if [ $IS_ONLINE -eq 0 ]; then
    # We never were able to get online. Kill script.
    exit 1
fi

# Now we enter our normal code here. The above was just for online checking

这不是最优雅的——我不确定如何通过系统上的简单命令或文件进行检查,但这在我需要时很有用。

答案2

我认为你可以使用暴发户帮助您。请注意,我还没有测试过下面的代码是否有效,但非常类似的代码应该有效。

# /etc/init/update-repositories.conf - Update local repos
#

description     "Update local repos"

# this will run the script section every time network is up
start on (net-device-up IFACE!=lo)

task

script
    svn up && git fetch
#   do some other useful stuff
end script

差不多就是这样了。您可能想添加一些代码来检查它是否运行得不太频繁。您可能还想将其添加start update-repositories到 crontab 中,以确保如果您长时间上网,更新仍会发生。

答案3

您可以与 NetworkManager 通信以查看您是否已连接:

$state = $(dbus-send --system --print-reply \
    --dest=org.freedesktop.NetworkManager \
    /org/freedesktop/NetworkManager \
    org.freedesktop.NetworkManager.state 2>/dev/null \
| awk '/uint32/{print $2}')
if [ $state = 3 ]; then
    echo "Connected!"
else
    echo "Not connected!"
fi

答案4

要扩展 nixternal,fping二进制文件非常适合。你可以用一行代码编写它,如下所示

$ fping -q yoo.mama && echo yes
$ fping -q www.google.com && echo yes
yes
$ 

如你所见,yoo.mama 不喜欢我,但 Google 喜欢。在 crontab 中,你可以执行类似以下操作

5 5 * * *  root   fping -q google.com && /some/script/I/want --to --run

相关内容