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

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

我有一台 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

在我的计算机上,dhclient重新连接网络时 NetworkManager 会重新启动。所以也许您可以使用该dhclient过程的启动时间?

ps -o start,cmd $(pgrep dhclient)

答案2

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

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

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

答案3

这应该在几秒钟内完成你想要的事情:

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

答案4

如果它是一个动态创建的接口,如 PPP 连接或无线主机网络接口(例如,使用 create_ap 创建),您可以使用以下修改日期/sys/class/net

$ ls -lt /sys/class/net/ppp0
lrwxrwxrwx 1 root root 0 Jun 12 09:50 /sys/class/net/ppp0 -> ../../devices/virtual/net/ppp0

并计算与现在相差的秒数,如下所示:

$ echo "$(($(date +%s)-$(stat -c %Y /sys/class/net/ppp0)))"

涉及子 shell 和 bash 计算,但工作可靠并在几秒钟内为您提供结果,以便您根据自己的喜好/需要进行进一步处理:

877

相关内容