So protokollieren Sie das Unterbrechen der Internetverbindung


7

Ich muss ein Skript ausführen, sobald mein Himbeer-Pi mit dem Internet verbunden ist. Ich habe mich jedoch gefragt, ob es einen besseren Weg gibt, als nur jede Minute oder so Google anzupingen.

Mein Problem ist, dass meine Internetverbindung im Laufe des Tages 1-2 Mal unterbrochen wird, sodass ich eine Möglichkeit brauche, solche Ereignisse zu protokollieren.
Es ist nur die ADSL, die tagsüber abfällt. Ich habe nach einer Möglichkeit gesucht, mich zu protokollieren, wenn sie auftritt, auch wenn ich sie nicht bemerke. Ich denke, ich werde ein Skript wie vorgeschlagen einrichten.


In meinem Fall müsste ich nur erkennen, wann ich eine öffentliche IP-Adresse erhalte ... mit so wenigen Details ist es nicht wirklich einfach.
Rui F Ribeiro

1
Beheben Sie das Problem am besten, dh warum wird Ihre Verbindung unterbrochen? Welches Betriebssystem verwenden Sie? Haben Sie versucht, IPv6 zu deaktivieren?
Panther

1
Ich habe Probleme mit meinem ISP und wollte diese Ereignisse protokollieren, bevor ich sie um Unterstützung bat.
Matteo

Verlieren Sie die Konnektivität oder verliert Ihr lokales Netzwerk oder Router die Konnektivität?
Mchid

1
Der richtige Ort, um einen DSL-Verbindungsabbruch zu erkennen, ist der DSL-Router oder der DHCP-Client, der dahinter steht (wenn es sich um eine andere Appliance handelt).
Gilles 'SO - hör auf böse zu sein'

Antworten:


8

Sie können Folgendes überprüfen:

cat /sys/class/net/wlan0/carrier

wo wlan0 ist meine internetschnittstelle. Sie können jede Schnittstelle verwenden, die Sie verwenden, z. B. eth0, eth1, wlan0 für die Internetverbindung. Wenn die Ausgabe dieses Befehls 1 ist, sind Sie verbunden. Andernfalls können Sie ein Skript wie folgt schreiben:

#!/bin/bash
# Test for network conection
for interface in $(ls /sys/class/net/ | grep -v lo);
do
if [[ $(cat /sys/class/net/$interface/carrier) = 1 ]]; then ; echo "online"; fi
done

Sie können auch den folgenden Befehl verwenden:

#hwdetect --show-net

Dieses Skript funktioniert auch gut:

#!/bin/bash

WGET="/usr/bin/wget"

$WGET -q --tries=20 --timeout=10 http://www.google.com -O   /tmp/google.idx &> /dev/null
if [ ! -s /tmp/google.idx ]
then
  echo "Not Connected..!"
else
  echo "Connected..!"
fi

Ich muss tatsächlich die Verbindung zum Internet überprüfen, nicht den Router
Matteo

Sie können auch Curl anstelle von Ping verwenden
Ijaz Ahmad Khan

Wenn Sie den Status einer lokalen Schnittstelle verfolgen und Raspbian oder ähnliches ausführen, ist es am besten, Skripte in /etc/network/if-up.dund / oder zu verwenden /etc/network/if-down.d. Ich denke jedoch, dass Sie einen dazwischenliegenden Router haben, und das ist nicht hilfreich.
mc0e

Schamloser Plug: Ausgehend von dieser Antwort habe ich eine Reihe von Skripten mit dem Namen net-test erstellt .
Noah Huppert

5

Die Frage an Ihr System, ob es glaubt, eine Verbindung zu haben, ist ein Proxy-Maß für "Lässt mein ISP Sachen fallen?". Proxy-Maßnahmen sind per Definition ein vereinfachtes Modell des interessierenden Systems und bewahren keine Informationen. Die Frage kann nur beantwortet werden, indem Sie tatsächlich die Informationen erhalten, an denen Sie interessiert sind.

pingist eigentlich eine schlechte Auswahl an Tests, da es sich um ein ICMP-Protokoll handelt, das häufig speziell behandelt wird. Wenn Sie zum Beispiel an einer HTTP-Konnektivität interessiert sind

curl --head http://www.example.com

wird zeigen, ob Sie tatsächlich Seiten bekommen können. Wenn Sie es abfragen, seien Sie höflich und schlafen Sie mindestens 60 Sekunden dazwischen. Ein ISP-Ausfall von weniger als einer Minute kann als "kein Ausfall" angesehen werden.


2

Angesichts Ihrer relativ einfachen Anforderung reicht ein einfacher Ping aus. Sie müssen Google nicht als Testhost verwenden. Wenn Ihr ISP über eine öffentliche Website verfügt, was heutzutage sehr wahrscheinlich ist, verwenden Sie diese.

Hier ist ein [Bash] -Skript, das ich für ein altes, angehaltenes Projekt von mir verwenden wollte. Es ist nur ein pingHost und sammelt Statistiken, die es bei Bedarf in das Systemprotokoll druckt. Die einzigen Abhängigkeiten sind pingund bc. Beachten Sie, dass Sie eine nicht so alte Version von benötigen ping, dh eine Linux-fähige Version ping.

Das Skript verwendet vordefinierte Intervall- und Signaturwerte und kann interaktiv oder im Hintergrund ausgeführt werden - z. B. für den Fall, dass Sie eine Protokollierung benötigen. Es muss ein externer Befehl gegeben werden. Sie erhalten eine Flattererkennung und eine Link-Up / Down-Erkennung zum gleichen Preis ;-). Sie haben Hilfe eingebettet, falls Sie diese benötigen. Zögern Sie nicht zu fragen, wenn Sie Fragen haben.

Ich habe es als Übung geschrieben und dabei den Speicherbedarf so gering wie möglich gehalten. Ich erinnere mich, dass ich geplant hatte, es mit Dash laufen zu lassen, aber es gibt einen Bashismus, den ich bisher nicht loswerden konnte. In der Hoffnung, dass Sie es nützlich finden, geht es los:

#!/bin/bash
#
#  ping.sh
#
#  Copyright 2014 VinzC <vinzc@users.sf.net>
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
#  MA 02110-1301, USA.
#
# Runs in the background ping'ing given addresses. May send
# notifications through an external routine that is given as
# an argument.
#
# Uses environment variables:
#   * LOG_FILE (log file for debug purposes, silent otherwise)
#
# Symlinked as /usr/bin/anemon-ping

VERSION=1.0.3
AUTHOR="VinzC <vinzc@users.sf.net>"
DATE="Jan 2014"

# Background ping, keep only relevant information from the
# response, add timestamp in seconds. For use with graphing.

# Default padding for ICMP packets
ICMP_PADDING_DEFAULT=ffeab16b00b1e2

# Default number of seconds between ICMP probes
ICMP_INTERVAL_DEFAULT=300

# Number of samples to declare a host state steady
ICMP_STEADY_THRESHOLD=3

# Number of samples in which a host is allowed to go down
# 3 times before being flagged as flapping. (Why 3? 2 is
# not enough to make it a habbit, 3 is...)
ICMP_FLAPPING_THRESHOLD=24

# Number of samples after which dupe and damaged packets
# are gone for good. Default matches 24 hours.
ICMP_NET_ERROR_THRESHOLD=288

# Host state change command. The command is called with two or
# three arguments: host name and state, plus optional arguments.
# See usage for events.
host_cmd=false

# True if results shall be written to the standard output
verbose=false

# State variables
host_state=1            # Bit0: 1=up, 0=down
                        # Bit1: 1=flapping, 0=normal
host_unavail_state=0    # State counters
host_flap_state=0
host_warning_state=0

rtt_min=                # Ping statistics
rtt_max=
rtt_avg=

icmp_seq=0              # Number of requests
icmp_lost=0             # Count of losses

icmp_dupes=             # Network errors (counters)
icmp_damaged=

usage()
{
    cat <<EOF

USAGE
    ${0##*/} [-i interval] [-p pattern] [-P string] [-I interface]
        [-s packetsize] [-W timeout] [-v] [--host-command=CMD]
        [--flapping-threshold=N] [--error-threshold=N] destination
    ${0##*/} -h

ARGUMENTS
    Short options are a subset of standard ping arguments with the
    exception of -P and -v. Both -p and -P define a custom padding.
    Unlike ping's -p, option -P accepts any alphanumeric string,
    which will be converted to a hexadecimal string. The resulting
    pattern is eventually truncated to 16 bytes.

    Option -v switches to verbose mode. In this mode echo replies
    are sent to the standard output. This is useful for testing.

    -h  prints this help page.

    --host-command=CMD

        Run CMD on events. The first argument is the destination
        parameter, the second is the event name. Some events may
        have additional parameters.

        All events except the echo reply are sent to the system
        log. Events are:

        "start"     The monitoring process has been started. The
                external script can initialize its working
                context, e.g. create a round-robin database
                to store echo reply TTL values. An additional
                argument is passed with the interval value if
                option -i was specified. The default interval
                matches RRD default step, i.e. 300 seconds.
        "stop"      The monitoring process is stopping.
        "icmp"      Echo reply. Additional arguments are timestamp
                and roudtrip time. This event occurs every 5
                minutes by default and can be changed with -i.
        "up"        Host is up, steadily.
        "down"      Host is down, steadily.
        "flapping"  Host state is unstable.
        "damaged"   Damaged packets were detected.
        "dupes"     Duplicate packets were detected.

    --flapping-threshold=N

        The script attempts to detect flapping interfaces. It uses
        a discrete formula to keep a reasonable maximum delay in
        cases flapping occurs frequently, which must be considered
        a critical situation. Flapping detection is done as soon
        as no response from the remote host is received. No echo
        reply for more than 3 samples is a steady "down" state.

        An interface that has been flapping will take longer to be
        considered steady again. The value of --flapping-threshold
        sets that delay to the same amount of samples.

        The default value for N is 24. A bigger value will make an
        flapping interface wait proportionally longer before it is
        marked "up" again.

    --error-threshold=N

        Linux only: the background ping process informs whenever
        duplicated or damaged packets are received from a remote
        host. Such network errors are notified no more than once
        in N samples.

INTERACTIVE CONTROL
    The script reacts to signal SIGHUP to print statistics on the
    PING process running in the background. If verbose mode is
    enabled (-v) statistics are sent to the standard output. They
    are sent to the system log otherwise.

    Example:
        ${0##*/} --host-command=... host &
        PID=$!
        ...
        kill -HUP $PID

    PING statistics include min, avg and max roundtrip times and
    percentage of lost echo replies. Individual figures are also
    shown for damaged and duplicate packets if there are any.

    Note that the average value is a running average that uses a
    discrete averaging algorithm, i.e.:

        avg(i) = [ avg(i-1) + x(i-1) ] / 2

SEE ALSO
    man ping, ping(8)
EOF
    exit 0
}

help()
{
    cat <<EOF
${0##*/} version $VERSION, © $DATE by $AUTHOR

Monitors a remote host periodically sending ICMP packets from a ping
process running in the background. The script can execute a custom
command each time an important network condition occurs. The main
purpose is to record echo reply times in a round-robin database for
further graphing.
EOF
    usage
}

bc()
{
    # Workaround to print the leading zero for values <1
    /usr/bin/bc | sed 's/^\./0./g'
}

# Parse command line arguments. Only parse new or overriden arguments.
# Used to determine the remote host, mainly.
parse_args()
{
    # Need a F@!#^}G temporary variable to check getopt return code!
    args="$(getopt \
        -o i:I:p:P:s:W:hv \
        -l host-command:,flapping-threshold:,error-threshold \
        -- "$@")" && eval set -- "$args" && unset args || return $?

    # Now check the remaining arguments
    while [ -n "$1" ]; do
        [ "$1" = "--" ] || case $1 in

            --host-command)
                host_cmd=$2; shift;;

            --flapping-threshold)
                ICMP_FLAPPING_THRESHOLD=$2; shift;;

            --error-threshold)
                ICMP_NET_ERROR_THRESHOLD=$2; shift;;

            -i)
                ICMP_INTERVAL=$2; shift;;
            -p)
                ICMP_PADDING=$2; shift;;
            -P)
                ICMP_PADDING=$(printf "$2" | od -A n -t x1 | \
                    sed -r -e 's:\s+::g' -e 's:.::33g'); shift;;
            -I)
                ICMP_IFACE=$2; shift;;
            -s)
                ICMP_PKTSIZE=$2; shift;;
            -W)
                ICMP_TIMEOUT=$2; shift;;
            -v)
                verbose=true;;
            -h)
                help;;
            *)
                ICMP_HOST="$1";;
        esac; shift
    done
    [ -n "$ICMP_HOST" ] || usage 1>&2
}

logger()
{
    # Write to standard output in verbose mode, to syslog otherwise
    $verbose && echo "$@" || \
        /usr/bin/logger -t "${0##*/}[$$]" "$@"
}

set_response_time()
{
    # Call external command or prompt to the console in verbose mode
    $host_cmd $ICMP_HOST "icmp" $1 $3 && ! $verbose || \
        printf "%d: seq=%d, time=%s\n" "$1" "$2" "$3"
    return 0
}

set_state_up()
{
    # Clear flapping state ans set (steady) up flag
    host_state=0x01

    # Call the external notification function and log host state
    $host_cmd $ICMP_HOST "up"
    logger "Host interface or host @ $ICMP_HOST is now up."
}

set_state_down()
{
    # Clear up flag only
    host_state=$(( host_state & 0xFE ))

    # Call the external notification function and log host state
    $host_cmd $ICMP_HOST "down"
    logger "Host interface or host @ $ICMP_HOST is down!"
}

set_state_flapping()
{
    # Set flapping and down flags
    host_state=2

    # Call the external notification function and log host state
    $host_cmd $ICMP_HOST "flapping"
    logger "Host interface or host @ $ICMP_HOST is unstable!"
}

set_host_message()
{
    # Reset error counter to the maximum
    host_warning_state=$ICMP_NET_ERROR_THRESHOLD

    # Call the external notification function and log host state
    $host_cmd $ICMP_HOST $1
    logger "Errors received from host interface or host @ $ICMP_HOST ($1)!"
}

print_stats()
{
    if [ $icmp_seq -eq 0 ]; then
        logger "PING $ICMP_HOST: no packet sent"
    else
        local icmp_received=$(( icmp_seq - icmp_lost ))
        local icmp_losses=$( echo "scale=2; 100 * $icmp_lost / $icmp_seq" | bc )
        logger "PING $ICMP_HOST: $icmp_seq packets sent, $icmp_lost lost, ${icmp_losses}% loss${rtt_min:+; rtt min/avg/max = $rtt_min/$rtt_avg/$rtt_max ms}${icmp_dupes:+, $icmp_dupes dupes}${icmp_damaged:+, $icmp_damaged bad CRC}"
    fi
}

echo_reply()
{
    # First argument is time in seconds (icmp_seq is global)
    local TM=$1 ttl time msg; shift

    # Evaluate the remaining arguments as expressions
    eval "$@"

    # No time variable means host is not responding
    [ -z "$time" ] && return 1

    # Update statistics: average, minimum and maximum RTT
    rtt_avg=$( echo "scale=3; (${rtt_avg:-$time} + $time)/2" | bc )
    rtt_min=$( echo "scale=3; rtt_min=${rtt_min:-$time}; if ($time < rtt_min) $time else rtt_min" | bc )
    rtt_max=$( echo "scale=3; rtt_max=${rtt_max:-$time}; if ($time > rtt_max) $time else rtt_max" | bc )

    # Decrement the state counter if greater than zero
    [ $host_unavail_state -ne 0 ] && \
        host_unavail_state=$(( host_unavail_state - 1 ))

    # The host is not up if:
    # - it is flapping (bit 1 of the state flag) and the flapping
    #   counter is greater than 0  OR
    # - the state counter is greater than 0 (non flapping case).
    # As long as one of these condition is true, the state flag
    # will not be set to UP (bit 0 set, bit 1 cleared).
    #
    # Once the state counter reaches zero (steady "up" state) and
    # the host state is no longer flapping, change the state flag.
    # Also don't change the state flag if bit 0 was already set.
    [ $(( host_state & 0x02 )) -ne 0  ] && [ $host_flap_state -ne 0 ] || \
    [ $host_unavail_state -ne 0 ] || \
    [ $(( host_state & 0x01 )) -ne 0 ] || \
        set_state_up

    # Warn if damaged or duplicate packets. Don't warn
    # again until the warning counter reaches zero. Treat
    # damaged and dupe packets alike for both are very
    # unlikely to occur at the same time.
    if [ -n "$msg" ]; then
        eval rtt_$msg=$(( rtt_$msg + 1 ))
        [ $host_warning_state -eq 0 ] && set_host_message $msg
    fi

    # Run external command to store response time
    set_response_time $TM $icmp_seq $time
    return 0
}

no_response()
{
    # Store the number of lost replies
    icmp_lost=$(( icmp_lost + 1 ))

    # FLAPPING DETECTION
    # ------------------
    # Increment flapping state using a discrete low-pass formula
    # to prevent excessive values. Handle flapping only if host
    # has just come down, don't wait for a steady "down" state.
    [ $host_unavail_state -eq 0 ] && \
    [ $(( host_flap_state=(3*host_flap_state + 7*ICMP_FLAPPING_THRESHOLD) / 8 )) -gt $ICMP_FLAPPING_THRESHOLD ] && \
        set_state_flapping

    # Increment host state until it reaches the threshold, which
    # marks the steady "down" state. Only then call the external
    # command to allow notifying the host is "down". Just don't
    # call the command more than once if the host is still down
    # by the next time.
    [ $host_unavail_state -lt $ICMP_STEADY_THRESHOLD ] && \
    [ $(( host_unavail_state=host_unavail_state + 1 )) -eq $ICMP_STEADY_THRESHOLD ] && \
    [ $(( host_state & 0x03 )) -eq 1 ] && \
        set_state_down
}

# Parse command-line arguments and set globals
parse_args "$@" || exit $?

# Redirect stderr to LOG_FILE if defined
[ -z "$LOG_FILE" ] || exec 2>$LOG_FILE

# Print PING statistics upon receiving SIGUSR1
trap print_stats HUP

# Send even "stop" upon terminating
trap "printf '\n'; $host_cmd $ICMP_HOST stop; print_stats" INT QUIT TERM ABRT


# Notify monitoring starts
$host_cmd $ICMP_HOST "start"

# 1. filter out lines keeping only those that include response
#    times and those about non responding hosts.
# 2. Stick units to response times and keep only the multiplier
#    if it's different from "m"
# 3. Keep only the integer part of the timestamp, erase garbage
#    before the relevant information (var=value)
# 4. Warn about damaged and duplicate packets
#
# Make sure sed does NOT buffer output (hence -u)
while read R; do
    echo_reply $R || no_response

    # Decrement other state variables until it reaches zero
    [ $host_flap_state -eq 0 ] || \
        host_flap_state=$(( host_flap_state - 1 ))

    [ $host_warning_state -eq 0 ] || \
        host_warning_state=$(( host_warning_state - 1 ))

# Downside: need bash for process redirection, which is needed
# to access state variables outside the while/read loop...
done < <(LC_ALL=POSIX /bin/ping -OD \
    ${ICMP_IFACE:+-I $ICMP_IFACE} \
    ${ICMP_TIMEOUT:+-W $ICMP_TIMEOUT} \
    ${ICMP_PKTSIZE:+-s $ICMP_PKTSIZE} \
    -i ${ICMP_INTERVAL:-$ICMP_INTERVAL_DEFAULT} \
    -p ${ICMP_PADDING:-$ICMP_PADDING_DEFAULT} $ICMP_HOST |
sed -rnu \
    -e '/no answer|[0-9]+ bytes from/!d' \
    -e 's@(time=[0-9.]+)\s+m?(\w*)s@\1\2@g' \
    -e 's@\(DUP\!\)@msg="dupes"@g' \
    -e 's@\(BAD CHECKSUM\!\)@msg="damaged"@g' \
    -e 's@\[(\w+)\.\w+\][a-zA-Z0-9():. \-]+\s+@\1 @gp')

1

Ein Netzwerktest ist wahrscheinlich am einfachsten zu implementieren, und ein wenig regelmäßiger Datenverkehr kann auch dazu beitragen, Zeitüberschreitungen zu vermeiden, wenn dies Teil des Bildes ist, warum Ihre Verbindung unterbrochen wird. Ich gehe davon aus, dass Sie nur den Link zu Ihrem ISP testen möchten. Pingen Sie also den Ping-Server des ISP, anstatt Google zu pingen.

Wenn Sie vermeiden möchten, Netzwerkverkehr zum Testen zu senden, ist es wahrscheinlich am besten, Informationen über den Netzwerkstatus von Ihrem Router zu erhalten. Wie das geht, hängt davon ab, welchen Router Sie verwenden. Je nachdem, was Sie haben, können Sie möglicherweise über Telnet, SSH, SNMP oder http darauf zugreifen. Je nachdem, was Sie verwenden, stehen verschiedene Optionen für die Skripterstellung zur Verfügung.

Mit gängigen Commodity-Routern für den Heimgebrauch haben Sie wahrscheinlich http, aber möglicherweise nicht viel anderes. Möglicherweise protokolliert Ihr Router bereits Netzwerk-Up / Down-Ereignisse. Ihr Problem besteht darin, eine http-Sitzung zu skripten, um die Authentifizierung beim Router auszuhandeln, und eine Kopie des vorhandenen Protokolls abzurufen, um eine Kopie auf Ihrem Raspbian zu aktualisieren. Die meisten Router speichern das Protokoll nicht und verlieren es beim Neustart.

Zu Ihren flexibelsten Optionen gehört wahrscheinlich das Ausführen einer alternativen Linux-basierten Firmware auf Ihrem Router.


0

Installieren Sie das hier beschriebene Shell-Skript: Coupure-Shell-Skript . <ad>Dies ist eine Art Ping, der weniger ausführlich und intelligenter ist .</ad>

Verwenden Sie es nach der Installation parallel, um Stürze auf Ihrem ISP (z. B. einem seiner DNS-Server, der die höchste Konnektivität aufweisen sollte) und im Internet hinter Ihrem ISP (z. B. einem der Google-Server) zu erkennen.

Mit diesen parallelen Läufen können Sie feststellen, ob Sie ein Problem mit Ihrem ISP-Zugang oder mit dem Internet dahinter haben.


0

zu @Ijaz Khan hinzufügen eine E-Mail-Benachrichtigung posten, wenn nicht vorhanden (wird später gesendet ...)

#!/bin/bash

WGET="/usr/bin/wget"
while true;do
        $WGET -q --tries=20 --timeout=10 http://www.google.com -O   /tmp/google.idx &> /dev/null
        if [ ! -s /tmp/google.idx ]
        then
          echo "Not Connected..! $(hostname)"| mail -s "Not connected $(hostname) $(date)" root
        else
          echo "Connected..!"
        fi
        sleep 1
done
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.