我有一些每天运行的 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