Como posso obter informações sobre o tempo de atividade de uma interface de rede?

8

Eu tenho uma máquina Ubuntu e uma máquina Debian.

Em ambos, desejo ver por quanto tempo uma interface de rede foi conectada. (Isto é, conectado a uma rede recebendo um IP, etc. Não é o estado físico de um cabel). Tempo de atividade em segundos ou data + hora desde a última alteração ou algo semelhante.

A partir de agora eu escrevi um pequeno script para fazer a tarefa, mas parece que deve haver uma maneira mais geral de verificar isso. Um programa ou algo assim em / proc ou algo assim.

Meu script:

#!/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
    
por Stefan Lithén 08.07.2013 / 21:31

4 respostas

1

O kernel do Linux não rastreia a hora em que uma interface é iniciada.

Dentro de struct net_device não há nenhum campo que contenha um valor jiffies para quando uma interface é iniciada.

O melhor que você pode gerenciar é algum método inferido de scripts e logs do espaço do usuário.

    
por 16.01.2015 / 20:56
0

Aqui está minha variante (muito parecida com a sua):

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

1116 - segundos após o IP ser concedido.

    
por 09.07.2013 / 01:27
0

Na minha máquina dhclient é reiniciado meu NetworkManager quando se reconectar à rede. Então, talvez você possa usar a hora de início do processo dhclient ?

ps -o start,cmd $(pgrep dhclient)
    
por 07.07.2014 / 21:06
0

Isso deve fazer o que você quiser, em 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!"

Quais resultados:

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: obtenha um timestamp STARTTIME , depois teste cada INTERVAL se o gateway (via ip route show ) ainda estiver ativo, se assim for, subtraia o timestamp atual do original e imprima. Se não, saia e indique que o host abandonou sua conexão. Veja as páginas de manual para explicação de cada uma das opções de comando. Se você não quiser a saída a cada segundo, aumente INTERVAL .

    
por 15.11.2014 / 07:22