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

4 ответа4

1

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

ps -o start,cmd $(pgrep dhclient)
1

Ядро Linux не отслеживает время запуска интерфейса.

В struct net_device нет поля, содержащего значение jiffies для запуска интерфейса.

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

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 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .