私は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
私のマシンでは、ネットワークに再接続すると、NetworkManagerによってdhclient
が再起動されます。では、dhclient
プロセスの開始時間を使用できますか?
ps -o start,cmd $(pgrep dhclient)
Linuxカーネルは、インターフェースが開始された時刻を追跡しません。
以内に struct net_device
インターフェイスの開始時のjiffies
値を保持するフィールドはありません。
管理できる最善の方法は、ユーザー空間のスクリプトとログから推測される方法です。
これが私の変種です(あなたと非常によく似ています):
~ # expr $(echo $(date +%s) - $(date -d "`grep 'eth0: leased' /var/log/messages | tail -1 | awk '{print $1, $2, $3}'`" +%s))
1116
~ #
1116-IPがリースされてから数秒。
これは、秒単位であなたが望むことをするはずです:
#!/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
を増やします。