¿Cómo puedo obtener información sobre el tiempo de actividad de una interfaz de red?

8

Tengo una máquina Ubuntu y una máquina Debian.

En ambos quiero poder ver durante cuánto tiempo se ha conectado una interfaz de red. (Es decir, conectado a una red que obtiene una IP, etc. No es el estado físico de una cabellera). Tiempo de actividad en segundos o fecha + hora desde el último cambio o algo similar.

A partir de ahora he escrito un pequeño guión para hacer la tarea, pero parece que debería haber una forma más general de verificar esto. Un programa o algo en / proc o tal.

Mi guión:

#!/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
fuente
1
No hay tal cosa como "estar conectado a una red" que no sea tener una conexión física por cable. Tener una dirección IP asignada a una NIC no es un indicador de un estado de red. Si desea determinar la conectividad de red para una NIC, deberá monitorearla activamente (por ejemplo, enviando pings periódicos a otro objetivo o teniendo una conexión TCP persistente).
Der Hochstapler
Hum, bueno, entonces cuando mi enrutador se reinicia (toma aproximadamente 1 minuto), mi NIC tiene su IP eliminada y luego reasignada nuevamente (byt NetworkManager). Mi iMac hace algo similar. Lo que realmente quiero saber es cuándo se reinició el enrutador. En los registros de mi iMac y en Linux puedo ver cuándo fue reasignado de nuevo, pero supongo que sin algo como NetworkManager todavía tendría su IP asignada. Tal vez debería echar un vistazo más de cerca a NetworkManager. Gracias.
Stefan Lithén
1
Estoy asumiendo que NetworkManager (u otro componente) realiza un seguimiento de las conexiones activas. Si se interrumpe una conexión, determina la disponibilidad de su puerta de enlace (enrutador), una vez que detecta que está inactiva, puede liberar la dirección IP asignada a través de DHCP. O tal vez espera a que la puerta de enlace vuelva a estar disponible y luego solicita que se reasigne la dirección IP. De cualquier manera, esta pregunta propone usar ip monitor(entre otras cosas), podría valer la pena echarle un vistazo.
Der Hochstapler
1
Tal vez colocar un script /etc/dhcp3/dhclient-enter-hooks.d/también podría ser una opción. Pero no estoy encontrando suficiente información para decir cómo funciona exactamente.
Der Hochstapler
Si su enrutador se reinicia, es posible que desee ver qué efecto tiene en la red. Tengo un NAS que emite una serie de pitidos cuando desconecto el cable. En este momento, tiene un cable cruzado que lo conecta a un servidor. Si reinicio el servidor, el NAS pierde el enlace y hace ruido. Por lo que describe, realmente no le importan los paquetes IP, ni si un cable está enchufado en el puerto NIC de su computadora, pero sí desea saber sobre el enlace. Eso se puede detectar usando una tecnología llamada Media Sense. (La característica también podría llamarse "Estado de medios"). Intente registrar los cambios en eso.
TOOGAM

Respuestas:

1

El kernel de Linux no rastrea el momento en que se inicia una interfaz.

Dentro struct net_deviceno hay ningún campo que tenga un jiffiesvalor para cuando se inicia una interfaz.

Lo mejor que puede administrar es algún método inferido de los scripts y registros del espacio de usuario.

suprjami
fuente
1

En mi máquina, dhclientNetworkManager reinicia cuando se vuelve a conectar a la red. Entonces, ¿tal vez puedas usar la hora de inicio del dhclientproceso?

ps -o start,cmd $(pgrep dhclient)
hfs
fuente
0

Aquí está mi variante (muy similar a la tuya):

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

1116 segundos después de la concesión de IP.

septiembre
fuente
0

Esto debería hacer lo que quieras, en segundos:

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

Qué salidas:

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!

Teoría: obtenga una marca de tiempo STARTTIME, luego pruebe INTERVALsi la puerta de enlace (vía ip route show) aún está activa; si es así, reste la marca de tiempo actual del original e imprima. De lo contrario, salga e indique que el host ha desconectado su conexión. Consulte las páginas de manual para obtener una explicación de cada una de las opciones de comando. Si no desea salida cada segundo, aumente INTERVAL.

Glallen
fuente