Ich habe einige Anacron-Jobs, die täglich ausgeführt werden. Die Skripte aktualisieren lokale bzr- und git-Repositorys. Natürlich benötigen diese Skripte funktionierende Netzwerkverbindungen. Ich habe einen Laptop und oft ist das kabelgebundene und kabellose Internet nicht schnell genug. Dadurch kommt es zu einem Timeout meines Cron-Jobs beim Abrufen der Repositorys = (
Damit:
Wie kann sichergestellt werden, dass das Internet verfügbar ist, bevor bestimmte Cron-Jobs ausgeführt werden? Oder wie kann ein Job fehlgeschlagen werden, wenn kein Netzwerk vorhanden ist, sodass er später erneut von anacron versucht wird?
Ich denke, Sie können pstart verwenden, um Ihnen dort zu helfen. Wohlgemerkt, ich habe den folgenden Code nicht getestet, aber etwas sehr Ähnliches sollte funktionieren.
# /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
So ziemlich alles. Möglicherweise möchten Sie Code hinzufügen, um zu überprüfen, ob er nicht sehr oft ausgeführt wird. Möglicherweise möchten Sie auch start update-repositories
zu Ihrer Crontab hinzufügen. Dadurch wird sichergestellt, dass Ihr Update durchgeführt wird, wenn Sie über einen längeren Zeitraum im Internet sind.
Ich habe einen Cron erstellt, der einen Ping-Test auf einem DNS-Server durchgeführt hat, um die Vernetzung sicherzustellen. Etwas wie das:
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
Kürzlich habe ich so etwas benutzt:
#!/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
Dies ist nicht das eleganteste - ich bin nicht sicher, wie ich es über einen einfachen Befehl oder eine Datei auf dem System überprüfen soll, aber dies hat bei mir bei Bedarf funktioniert.
Um nur einige der Optionen in einem einzigen Skript zusammenzufassen:
#! /bin/bash
# This script checks that the interface is up, and that an internet connection is available
# It is based on code from http://askubuntu.com/questions/3299/how-to-run-cron-job-when-network-is-up
#
# Then it sleeps for a random number of seconds between 30 and 600.
# This is based on code from http://tldp.org/LDP/abs/html/randomvar.html
#
# Collated by @JonTheNiceGuy on 2015-10-15
function check_ipaddr
{
# Here we look for an IP(v4|v6) address when doing ip addr
# Note we're filtering out 127.0.0.1 and ::1/128 which are the "localhost" ip addresses
# I'm also removing fe80: which is the "link local" prefix
ip addr | \
grep -v 127.0.0.1 | \
grep -v '::1/128' | \
grep -v 'inet6 fe80:' | \
grep -E "inet [[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+|inet6" | \
wc -l
}
function check_google
{
netcat -z -w 5 8.8.8.8 53 && echo 1 || echo 0
}
until [ `check_ipaddr` -gt 1 ]; do
sleep 2
done
until [ `check_google` -eq 1 ]; do
sleep 2
done
sleep $((RANDOM%570+30))
Ich plane, dieses Skript unter https://Gist.github.com/JonTheNiceGuy/5cf4a23c8f2f755a9ca4 zu pflegen
Sie können mit NetworkManager sprechen, um festzustellen, ob Sie verbunden sind oder nicht:
$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
Um nixternal zu erweitern, eignet sich die Binärdatei fping
hervorragend dafür. Sie können es in Einzeiler wie in kochen
$ fping -q yoo.mama && echo yes
$ fping -q www.google.com && echo yes
yes
$
Wie Sie sehen, mag yoo.mama mich nicht, aber Google. In Crontab würden Sie so etwas tun
5 5 * * * root fping -q google.com && /some/script/I/want --to --run
until ifconfig eth | grep -qE 'addr:([[:digit:]]+\.?)+'; do
sleep 2
done
Ich habe einen bash
-Alias definiert, um diese Frage zu beantworten:
alias netstate='ip link show | egrep -q '\''UP,LOWER_UP.* state UP'\'' && echo UP || echo DOWN'
Sie können es verwenden oder die Ausgabe von ip link show
selbst verarbeiten.
Um mit "net goes down/net comes up" umzugehen, lesen Sie mein net-o-matic
-Skript unter net-o-matic
Ich fand ping
Lösungen, die mir Netzwerkfehler bescherten, die meine Protokolle spammen, sofern ich die Fehler nicht mühsam an/dev/null weiterleitete
Network Manager kann verwendet werden:
if nmcli general | grep "^connected" >/dev/null
then
echo "nmcli connected"
fi
Ich erstelle ein Shell-Skript, das genau das tut, was Sie brauchen. Überprüft, ob eine Netzwerkverbindung besteht, und löst dann die Aktualisierungen aus. Rufen Sie dann das Skript von cron aus auf.