如何获取有关网络接口正常运行时间的信息?


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的网络连接,则必须主动对其进行监视(例如,通过向其他目标定期发送ping命令或建立持久的TCP连接)。
Der Hochstapler

嗯,好了,当我的路由器重启时(大约需要1分钟),我的NIC的IP已被删除,然后重新分配(byt NetworkManager)。我的iMac做类似的事情。我真正想知道的是路由器何时重启。在我的iMac和linux的日志中,我可以看到何时再次对其进行了重新分配,但是我想如果没有NetworkManager之类的东西,它仍然会分配IP?也许我应该仔细看看NetworkManager。谢谢。
StefanLithén13年

1
假设 NetworkManager(或另一个组件)对活动连接执行监视。如果连接断开,它将确定网关(路由器)的可用性,一旦检测到连接已断开,它可能会释放通过DHCP分配的IP地址。或者,它等待网关再次可用,然后请求重新分配IP地址。无论哪种方式,此问题都建议使用ip monitor(除其他外),值得一看。
Der Hochstapler

1
也许放置脚本/etc/dhcp3/dhclient-enter-hooks.d/也可能是一种选择。但是我找不到足够的信息来说明其工作原理。
Der Hochstapler

如果路由器重新启动,则可能需要查看其对网络产生的影响。当我断开电缆连接时,我的NAS会发出一系列的哔哔声。现在,它有一条交叉电缆将其插入服务器。如果我重新启动服务器,则NAS会丢失链接并产生噪音。根据您的描述,您实际上并不关心IP数据包,也不关心电缆是否已插入计算机的NIC端口,但是您确实想了解链接。可以使用称为Media Sense的技术进行检测。(该功能通常也称为“媒体状态”。)尝试记录对此的更改。
TOOGAM 2015年

Answers:


1

Linux内核不跟踪接口启动的时间。

struct net_device其中没有字段保存jiffies启动接口时的值。

您可以管理的最好方法是从用户空间脚本和日志中推断出一些方法。


1

dhclient重新连接到网络时,NetworkManager将在我的机器上重新启动计算机。因此,也许您可​​以使用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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.