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

8

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

Nos dois, quero poder ver por quanto tempo uma interface de rede está conectada. (Ou seja, conectado a uma rede recebendo um IP, etc. Não é o estado físico de um cabel). Tempo de atividade em segundos ou data e hora desde a última alteração ou algo semelhante.

Até agora, escrevi um pequeno script para executar a tarefa, mas parece que deve haver uma maneira mais geral de verificar isso. Um programa ou algo em / proc ou algo parecido.

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
Stefan Lithén
fonte
11
Não existe algo como "estar conectado a uma rede" além de ter uma conexão física por cabo. Ter um endereço IP atribuído a uma NIC não é um indicador de um estado de rede. Se você quiser determinar a conectividade de rede para uma NIC, precisará monitorá-la ativamente (por exemplo, enviando pings periódicos para outro destino ou ter uma conexão TCP persistente).
Der Hochstapler
Hum, bem, quando meu roteador é reinicializado (leva cerca de 1 minuto), minha placa de rede tem seu IP removido e depois é reatribuído novamente (by NetworkManager). meu iMac faz algo semelhante. O que realmente quero saber é quando o roteador foi reiniciado. Nos logs do meu iMac e no linux, posso ver quando foi reatribuído novamente, mas acho que sem algo como o NetworkManager, ele ainda teria o IP atribuído? Talvez eu devesse dar uma olhada no NetworkManager. Obrigado.
Stefan Lithén
11
Estou assumindo que o NetworkManager (ou outro componente) realiza monitoramento nas conexões ativas. Se uma conexão for interrompida, ela determinará a disponibilidade do seu gateway (roteador). Uma vez detectado que está inoperante, ele poderá liberar o endereço IP atribuído pelo DHCP. Ou talvez espere que o gateway esteja disponível novamente e solicite a reatribuição do endereço IP. De qualquer maneira, esta pergunta propõe o uso ip monitor(entre outras coisas), pode valer a pena dar uma olhada.
Der Hochstapler
11
Talvez colocar um script /etc/dhcp3/dhclient-enter-hooks.d/também possa ser uma opção. Mas não estou encontrando informações suficientes para dizer exatamente como isso funciona.
Der Hochstapler
Se o seu roteador for reiniciado, você poderá ver qual o efeito que ele tem na rede. Eu tenho um NAS que faz uma série de bipes quando eu desconecto o cabo dele. No momento, ele tem um cabo cruzado conectando-o a um servidor. Se eu reiniciar o servidor, o NAS perde o link e faz barulho. Pelo que você descreve, você realmente não se importa com pacotes IP, nem se um cabo está conectado à porta NIC do computador, mas você quer saber sobre o link. Isso pode ser detectado usando a tecnologia chamada Media Sense. (O recurso também pode ser chamado de "Estado da mídia".) Tente registrar as alterações nele.
TOOGAM 15/02

Respostas:

1

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

Dentro, struct net_devicenão há campo que detenha um jiffiesvalor para quando uma interface é iniciada.

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

suprjami
fonte
1

Na minha máquina dhclient, o NetworkManager é reiniciado ao se reconectar à rede. Então, talvez você possa usar o horário de início do dhclientprocesso?

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

Aqui está minha variante (muito semelhante à 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 concedido.

setembro
fonte
0

Isso deve fazer o que você quer, 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 saídas:

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 registro de data STARTTIMEe hora e , em seguida, teste INTERVALse o gateway (via ip route show) ainda está ativo; se houver, subtraia o registro de data e hora atual do original e imprima. Caso contrário, saia e indique que o host caiu sua conexão. Veja as páginas de manual para explicação de cada uma das opções de comando. Se você não deseja saída a cada segundo, aumente INTERVAL.

sombrio
fonte