it-swarm.com.de

Wie kann ich einen Cron-Job ausführen, wenn das Netzwerk aktiv ist?

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?

5
Dima

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.

8
vava

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.

4
Marco Ceppi

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

2
JonTheNiceGuy

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
2

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

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

0
waltinator

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

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.

0
Rich Johnson