web-dev-qa-db-fra.com

Comment exécuter le travail cron lorsque le réseau est en place?

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?

5
Dima

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.

8
vava

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.

4
Marco Ceppi

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

2
JonTheNiceGuy

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
2
Dennis Kaarsemaker

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
1
Dirk Eddelbuettel
until ifconfig eth | grep -qE 'addr:([[:digit:]]+\.?)+'; do
   sleep 2
done
0
cmcginty

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

0
waltinator

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
0
Jack Wasey

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.

0
Rich Johnson