Как я могу получить информацию о работоспособности сетевого интерфейса?

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-адреса, назначенного сетевой карте, не является индикатором состояния сети. Если вы хотите определить сетевое подключение для сетевого адаптера, вам нужно будет его активно отслеживать (например, отправляя периодические эхо-запросы на другую цель или имея постоянное TCP-соединение).
Der Hochstapler
Хм, хорошо, тогда, когда мой маршрутизатор перезагружается (занимает около 1 минуты), мой сетевой адаптер удаляет свой IP, а затем снова назначается (byt NetworkManager). мой iMac делает нечто подобное. Что я действительно хочу знать, так это когда маршрутизатор перезагружается. В журналах в моем iMac и в linux я вижу, когда он был переназначен снова, но я предполагаю, что без чего-то вроде NetworkManager у него все еще будет свой IP назначенный? Может быть, мне лучше взглянуть на NetworkManager. Спасибо.
Стефан Литен
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значение для запуска интерфейса.

Лучшее, чем вы можете управлять, - это какой-то логический метод из сценариев и журналов пользовательского пространства.

suprjami
источник
1

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

ps -o start,cmd $(pgrep dhclient)
HFS
источник
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), если это так, вычтите текущую временную метку из оригинала и напечатайте. Если нет, выйдите и укажите, что хост разорвал соединение. Смотрите man-страницы для объяснения каждого из параметров команды. Если вы не хотите выводить каждую секунду, увеличьте INTERVAL.

glallen
источник