Come posso ottenere informazioni sui tempi di attività di un'interfaccia di rete?


8

Ho una macchina Ubuntu e una macchina Debian.

Su entrambi voglio vedere per quanto tempo è stata connessa un'interfaccia di rete. (Cioè, collegato a una rete che ottiene un IP ecc. Non lo stato fisico di un cavo). Tempo di attività in secondi o data + ora dall'ultima modifica o qualcosa di simile.

A partire da ora ho scritto un piccolo script per svolgere il compito, ma sembra che ci dovrebbe essere un modo più generale per verificarlo. Un programma o qualcosa in / proc o simili.

La mia sceneggiatura:

#!/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

1
Non esiste qualcosa come "essere connessi a una rete" se non avere una connessione fisica via cavo. Avere un indirizzo IP assegnato a una scheda NIC non è un indicatore di uno stato di rete. Se si desidera determinare la connettività di rete per una scheda NIC, è necessario monitorarla attivamente (ad esempio, inviando ping periodici a un'altra destinazione o avendo una connessione TCP persistente).
Der Hochstapler,

Hum, beh allora quando il mio router si riavvia (impiega circa 1 minuto), la mia scheda di rete viene rimossa dall'IP e quindi riassegnata di nuovo (by NetworkManager). il mio iMac fa qualcosa di simile. Quello che voglio davvero sapere è quando il router si riavvia. Nei registri di iMac e Linux posso vedere quando è stato riassegnato di nuovo, ma suppongo che senza qualcosa come NetworkManager avrebbe ancora assegnato l'IP? Forse dovrei dare un'occhiata più da vicino a NetworkManager. Grazie.
Stefan Lithén,

1
Sto assumendo che NetworkManager (o un altro componente) esegue il monitoraggio sulle connessioni attive. Se una connessione si interrompe, determina la disponibilità del gateway (router), una volta rilevato che è inattivo, potrebbe rilasciare l'indirizzo IP assegnato tramite DHCP. O forse attende che il gateway sia di nuovo disponibile e quindi chiede la riassegnazione dell'indirizzo IP. Ad ogni modo, questa domanda propone di usare ip monitor(tra le altre cose), potrebbe valere la pena dare un'occhiata.
Der Hochstapler,

1
Forse inserire una sceneggiatura /etc/dhcp3/dhclient-enter-hooks.d/potrebbe anche essere un'opzione. Ma non sto trovando abbastanza informazioni per dire come funziona esattamente.
Der Hochstapler,

Se il router si riavvia, potresti voler vedere quale effetto ha sulla rete. Ho un NAS che emette una serie di segnali acustici quando scollego il cavo da esso. In questo momento, ha un cavo incrociato che lo collega a un server. Se riavvio il server, il NAS perde il collegamento e fa rumore. Da quello che descrivi, non ti importa davvero dei pacchetti IP, né se un cavo è collegato alla porta NIC del tuo computer, ma vuoi sapere del collegamento. Ciò può essere rilevato utilizzando la tecnologia denominata Media Sense. (La funzione potrebbe anche essere chiamata "Stato multimediale".) Prova a registrare le modifiche.
TOOGAM,

Risposte:


1

Il kernel Linux non tiene traccia del momento in cui viene avviata un'interfaccia.

All'interno struct net_devicenon esiste un campo che contenga un jiffiesvalore per l'avvio di un'interfaccia.

Il meglio che puoi gestire è un metodo dedotto dagli script e dai registri dello spazio utente.


1

Sul mio computer dhclientviene riavviato da NetworkManager quando si riconnette alla rete. Quindi forse puoi usare l'ora di inizio del dhclientprocesso?

ps -o start,cmd $(pgrep dhclient)

0

Ecco la mia variante (molto simile alla tua):

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

1116 - secondi dopo l'affitto dell'IP.


0

Questo dovrebbe fare quello che vuoi, in pochi secondi:

#!/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!"

Quali uscite:

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: ottenere un timestamp STARTTIME, quindi verificare INTERVALse il gateway (via ip route show) è ancora attivo, in tal caso, sottrarre il timestamp corrente dall'originale e stampare. In caso contrario, uscire e indicare che l'host ha interrotto la connessione. Vedere le manpage per la spiegazione di ciascuna delle opzioni di comando. Se non si desidera un output ogni secondo, aumentare INTERVAL.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.