Як я можу отримати інформацію про час роботи мережевого інтерфейсу?


8

У мене є машина Ubuntu і машина Debian.

І в обох я хочу бачити, як довго підключений мережевий інтерфейс. (Тобто, підключено до мережі, яка отримує IP та ін. Не фізичний стан кабелю). Час роботи в секундах або даті + час після останньої зміни або щось подібне.

На сьогодні я написав невеликий сценарій, щоб виконати завдання, але, здається, має бути більш загальний спосіб перевірити це. Програма чи щось у / proc чи щось подібне.

Мій сценарій:

#!/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
Не існує такого поняття, як "підключення до мережі", окрім того, щоб мати фізичне кабельне з'єднання. Наявність IP-адреси, призначеної NIC, не є показником стану мережі. Якщо ви хочете визначити мережеве підключення для NIC, вам доведеться його активно контролювати (наприклад, шляхом надсилання періодичних пінгерів до іншої цілі або постійного TCP-з'єднання).
Der Hochstapler

Хам, тоді, коли мій маршрутизатор перезавантажується (займає близько 1 хвилини), мій NIC його IP видалено, а потім перепризначив знову (байт NetworkManager). мій iMac робить щось подібне. Мені дуже хочеться знати, коли маршрутизатор перезавантажився. У журналах в моєму iMac та в Linux я можу побачити, коли він був перепризначений знову, але, мабуть, без чогось, як NetworkManager, він все одно повинен призначити IP? Можливо, я повинен більш детально роздивитись NetworkManager. Дякую.
Stefan Lithén

1
Я припускаю, що NetworkManager (або інший компонент) здійснює моніторинг активних з'єднань. Якщо з'єднання перерветься, воно визначає наявність вашого шлюзу (маршрутизатора), як тільки він виявить, що він відсутній, він може випустити IP-адресу, призначену через DHCP. А може, він чекає, коли шлюз знову стане доступним, а потім просить переназначити IP-адресу. Так чи інакше, це питання пропонує використовувати ip monitor(серед іншого), можливо, варто переглянути.
Der Hochstapler

1
Можливо, розміщення сценарію в /etc/dhcp3/dhclient-enter-hooks.d/також може бути варіантом. Але я не знаходжу достатньо інформації, щоб сказати, як саме це працює.
Der Hochstapler

Якщо ваш маршрутизатор перезавантажиться, ви можете дізнатися, який ефект він має в мережі. У мене є NAS, який робить серію звукових сигналів, коли відключаю кабель від нього. Зараз у нього є кросоверний кабель, який підключає його до сервера. Якщо я перезавантажую сервер, NAS втрачає зв'язок і видає шум. З того, що ви описуєте, вас не цікавлять ні IP-пакети, ні кабель підключений до порту NIC вашого комп'ютера, але ви хочете знати про посилання. Це можна виявити за допомогою технології під назвою Media Sense. (Ця функція може також часто називатися "Стан медіа".) Спробуйте ввійти до цього зміни.
TOOGAM

Відповіді:


1

Ядро Linux не відстежує час запуску інтерфейсу.

У struct net_deviceній немає поля, яке б утримувало jiffiesзначення при запуску інтерфейсу.

Найкраще, чим ви можете керувати, це певний метод, який можна зробити з скриптів і журналів простору користувача.


1

На моїй машині dhclientперезавантажується мережевим менеджером при повторному підключенні до мережі. То, можливо, ви можете використовувати час початку dhclientпроцесу?

ps -o start,cmd $(pgrep dhclient)

0

Ось мій варіант (дуже схожий на ваш):

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

1116 - секунди після передачі в оренду IP.


0

Це потрібно робити за бажання за лічені секунди:

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

Які виходи:

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!

Теорія: Отримайте позначку часу STARTTIME, а потім перевіряйте, INTERVALчи все ще є шлюз (через ip route show), якщо так, піднесіть поточну мітку часу від оригіналу та надрукуйте. Якщо ні, вийдіть і вкажіть, що хост перервав зв'язок. Дивіться вручні для пояснення кожного з параметрів команди. Якщо ви не хочете виводити щосекунди, збільште INTERVAL.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.