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