J'ai des travaux d'anacron qui fonctionnent quotidiennement. Les scripts mettent à jour les référentiels bzr et git locaux. Naturellement, ces scripts nécessitent des connexions réseau fonctionnantes. Je suis sur un ordinateur portable et souvent, l'accès Internet filaire et sans fil n'arrive pas assez vite. Cela fait expirer mon travail cron lors de l'extraction des référentiels = (
Alors:
Comment s’assurer de la présence d’Internet avant d’exécuter des tâches spécifiques? Ou comment faire échouer une tâche s’il n’existe pas de réseau, de sorte qu’elle soit à nouveau testée par anacron?
Je pense que vous pouvez utiliser pstart pour vous aider. Remarquez, je n'ai pas testé le code ci-dessous, mais quelque chose de très similaire devrait.
# /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
C'est à peu près ça. Vous voudrez peut-être ajouter du code pour vérifier qu'il ne s'exécute pas très souvent. Vous pouvez également vouloir ajouter start update-repositories
à votre crontab, cela garantira que votre mise à jour se produira si vous êtes constamment sur le net pendant une période prolongée.
J'ai fait un cron qui a fait un test de ping sur un serveur DNS pour assurer la mise en réseau. Quelque chose comme ça:
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
Récemment, j'ai utilisé quelque chose comme ceci:
#!/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
Ce n’est pas très élégant. Je ne sais pas comment vérifier via une simple commande ou un fichier sur le système, mais cela a fonctionné pour moi en cas de besoin.
Juste pour résumer quelques options ici dans un seul script:
#! /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))
Je prévois de maintenir ce script à https://Gist.github.com/JonTheNiceGuy/5cf4a23c8f2f755a9ca4
Vous pouvez parler à NetworkManager pour savoir si vous êtes connecté ou non:
$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
Pour développer nixternal, le binaire fping
est excellent pour cela. Vous pouvez le cuisiner en une seule couche comme dans
$ fping -q yoo.mama && echo yes
$ fping -q www.google.com && echo yes
yes
$
Comme vous le voyez, yoo.mama ne m'aime pas, mais Google l'aime. Dans crontab, vous feriez quelque chose comme
5 5 * * * root fping -q google.com && /some/script/I/want --to --run
until ifconfig eth | grep -qE 'addr:([[:digit:]]+\.?)+'; do
sleep 2
done
J'ai défini un alias bash
pour répondre à cette question:
alias netstate='ip link show | egrep -q '\''UP,LOWER_UP.* state UP'\'' && echo UP || echo DOWN'
Vous pouvez l'utiliser ou traiter vous-même la sortie de ip link show
.
Pour gérer "le réseau tombe en panne/le réseau monte", voir mon script net-o-matic
à l'adresse net-o-matic
J'ai trouvé ping
des solutions m'apportaient des erreurs de réseau qui spammaient mes journaux à moins de diriger laborieusement les erreurs vers/dev/null
Network Manager peut être utilisé:
if nmcli general | grep "^connected" >/dev/null
then
echo "nmcli connected"
fi
Ce que je fais est de créer un script Shell qui fait ce dont vous avez besoin, à savoir. vérifie la connexion réseau, puis déclenche les mises à jour. Ensuite, appelez le script de cron.