web-dev-qa-db-ja.com

ネットワークインターフェイスの稼働時間に関する情報を取得するにはどうすればよいですか?

私はUbuntuマシンとDebianマシンを持っています。

どちらの場合も、ネットワークインターフェイスが接続されている期間を確認したいと思います。 (つまり、IPなどを取得するネットワークに接続されています。cabelの物理的な状態ではありません)。秒単位の稼働時間または日付+最後の変更からの時間または同様のもの。

今のところ、タスクを実行するための小さなスクリプトを作成しましたが、これを確認するためのより一般的な方法があるはずです。/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
8
Stefan Lithén

私のマシンでは、ネットワークに再接続すると、NetworkManagerによってdhclientが再起動されます。では、dhclientプロセスの開始時間を使用できますか?

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

Linuxカーネルは、インターフェースが開始された時刻を追跡しません。

以内に struct net_deviceインターフェイスの開始時のjiffies値を保持するフィールドはありません。

管理できる最善の方法は、ユーザー空間のスクリプトとログから推測される方法です。

1
suprjami

これが私の変種です(あなたと非常によく似ています):

~ # expr $(echo $(date +%s) - $(date -d "`grep 'eth0: leased' /var/log/messages | tail -1 | awk '{print $1, $2, $3}'`" +%s))
1116
~ #

1116-IPがリースされてから数秒。

0
september

これは、秒単位であなたが望むことをするはずです:

#!/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を増やします。

0
glallen