Jak mogę uzyskać informacje o czasie pracy interfejsu sieciowego?

8

Mam maszynę Ubuntu i maszynę Debian.

W obu przypadkach chcę widzieć, jak długo podłączony jest interfejs sieciowy. (To znaczy, podłączony do sieci uzyskującej IP itp. Nie fizyczny stan kabla). Czas działania w sekundach lub data + czas od ostatniej zmiany lub coś podobnego.

Na razie napisałem mały skrypt do wykonania zadania, ale wydaje się, że powinien istnieć bardziej ogólny sposób na sprawdzenie tego. Program lub coś w / proc lub coś takiego.

Mój skrypt:

#!/bin/bash

if [ -f /etc/os-release ]; then

    if TMP=$(grep -i 'ubuntu' /etc/os-release); then

        # we are on ubuntu
        for i in $(/bin/ls -1 /var/log/syslog* | sort -r); do
                TMP=$(zgrep '(eth0): device state change: ip-config -> activated' "$i" | tail -1 | sed "s/ "$(hostname)"/*/")
        done

        WHEN=$(echo "$TMP" | cut -f1 -d '*')
        SEC=$(echo "$(date +%s) - $(date -d "$WHEN" +%s)" | bc)
        echo "Last link up: $WHEN ($SEC seconds ago)."

    elif TMP=$(grep -i 'debian' /etc/os-release); then

        # we are on debian
        TMP=$(grep 'eth0: link up' /var/log/syslog* | tail -1 | cut -f2- -d':' | sed "s/ "$(uname -n)" kernel:/*/")
        WHEN=$(echo "$TMP" | cut -f1 -d '*')
        SEC=$(echo "$(date +%s) - $(date -d "$WHEN" +%s)" | bc)
        echo "Last link up: $WHEN ($SEC seconds ago)."

    fi

else
    echo "File /etc/os-release not found."
fi
Stefan Lithén
źródło
1
Nie ma czegoś takiego jak „połączenie z siecią” poza fizycznym połączeniem kablowym. Przypisanie adresu IP do karty sieciowej nie jest wskaźnikiem stanu sieci. Jeśli chcesz określić łączność sieciową dla karty sieciowej, będziesz musiał ją aktywnie monitorować (na przykład wysyłając okresowe pingi do innego celu lub utrzymując stałe połączenie TCP).
Der Hochstapler
Hum, no to kiedy mój router ponownie się uruchamia (zajmuje to około 1 minuty), moja karta sieciowa ma swój adres IP usunięty, a następnie ponownie przypisany (byt NetworkManager). mój iMac robi coś podobnego. Naprawdę chcę wiedzieć, kiedy router uruchomił się ponownie. W dziennikach mojego komputera iMac i w systemie Linux widzę, kiedy został ponownie przypisany, ale wydaje mi się, że bez czegoś takiego jak NetworkManager nadal miałby przypisany adres IP? Może powinienem raczej przyjrzeć się bliżej NetworkManagerowi. Dziękuję Ci.
Stefan Lithén
1
Jestem zakładając, że NetworkManagera (lub inny element) zapewnia nadzór na aktywnych połączeń. Jeśli połączenie zostanie zerwane, określa dostępność bramy (routera), gdy wykryje, że nie działa, może zwolnić adres IP przypisany przez DHCP. A może czeka na ponowne udostępnienie bramy, a następnie prosi o ponowne przypisanie adresu IP. Tak czy inaczej, to pytanie proponuje użycie ip monitor(między innymi), może warto spojrzeć.
Der Hochstapler
1
Może umieszczenie skryptu /etc/dhcp3/dhclient-enter-hooks.d/może być również opcją. Ale nie znajduję wystarczających informacji, aby powiedzieć, jak to dokładnie działa.
Der Hochstapler
Jeśli router zrestartuje się, możesz sprawdzić, jaki ma on wpływ na sieć. Mam serwer NAS, który wydaje serię sygnałów dźwiękowych po odłączeniu od niego kabla. W tej chwili ma kabel krosowy łączący go z serwerem. Po ponownym uruchomieniu serwera NAS traci łącze i powoduje hałas. Z tego, co opisujesz, tak naprawdę nie zależy ci na pakietach IP ani na tym, czy kabel jest podłączony do portu NIC komputera, ale chcesz wiedzieć o łączu. Można to wykryć za pomocą technologii o nazwie Media Sense. (Ta funkcja może być często nazywana „stanem mediów”). Spróbuj zarejestrować zmiany w tym.
TOOGAM,

Odpowiedzi:

1

Jądro Linux nie śledzi czasu uruchomienia interfejsu.

Wewnątrz struct net_devicenie ma pola, które zawiera jiffieswartość dla momentu uruchomienia interfejsu.

Najlepszym, którym możesz zarządzać, jest metoda oparta na skryptach i dziennikach przestrzeni użytkownika.

suprjami
źródło
1

Na moim komputerze dhclientjest ponownie uruchamiany przez NetworkManager po ponownym połączeniu z siecią. Może więc możesz użyć czasu rozpoczęcia dhclientprocesu?

ps -o start,cmd $(pgrep dhclient)
hfs
źródło
0

Oto mój wariant (bardzo podobny do twojego):

~ # expr $(echo $(date +%s) - $(date -d "`grep 'eth0: leased' /var/log/messages | tail -1 | awk '{print $1, $2, $3}'`" +%s))
1116
~ #

1116 - sekund po dzierżawieniu IP.

wrzesień
źródło
0

To powinno zrobić, co chcesz, w kilka sekund:

#!/bin/bash
STARTTIME=`date +%s`
GATEWAY=`ip r s | grep default | cut -d' ' -f3`
INTERVAL=1
while ping -c 1 -W 1 ${GATEWAY} >/dev/null 2>&1; 
do
  awk -v STIME="$STARTTIME" 'BEGIN {
   DTIME=systime()-STIME;
   printf "Seconds of uptime since %s: %d\n",
     strftime("%a %b %e %H:%M:%S %Z %Y",STIME),
     DTIME; }';
  sleep $INTERVAL;
done

echo "HOST DROPPED!"

Które wyjścia:

user@host $ sh test-script.sh
Seconds of uptime since Sat Nov 15 01:14:26 EST 2014: 0
Seconds of uptime since Sat Nov 15 01:14:26 EST 2014: 1
Seconds of uptime since Sat Nov 15 01:14:26 EST 2014: 2
Seconds of uptime since Sat Nov 15 01:14:26 EST 2014: 3
Seconds of uptime since Sat Nov 15 01:14:26 EST 2014: 4
HOST DROPPED!

Teoria: Pobierz znacznik czasu STARTTIME, a następnie sprawdź , INTERVALczy brama (przez ip route show) jest nadal uruchomiona, jeśli tak, odejmij bieżący znacznik czasu od oryginału i wydrukuj. Jeśli nie, wyjdź i wskaż, że host przerwał połączenie. Zobacz strony podręcznika, aby uzyskać wyjaśnienie każdej z opcji polecenia. Jeśli nie chcesz generować co sekundę, zwiększ INTERVAL.

glallen
źródło