【linux】【bash】【network】サーバのトラフィックを監視するワンライナー
サーバのトラフィックをリアルタイムで監視するワンライナーを書きました。
もしかしたら需要があるかもしれないと考え、晒させていただきます!
経緯
- 別ネットワークに存在するサーバ間で、大量のデータを転送したい
- 回線圧迫を避けるためにrsyncで帯域制限をかけながら転送。でも本当に意図通りの制限がかかっているか不安。
- CactiやMRTGではリアルタイム監視できないし…
- iftopとか入れて使うのもありだけれど、別サーバで需要がある度にインストールするのもな…
と悩んで方法を色々探していたのですが、発見できませんでした。
そこで、ひとまず以下の形で落ち着きました。
方法
以下を実行していただければリアルタイムで確認できると思います。( 無理やりなワンライナーであることは気にしないでください。 )
tcコマンドを使って計算しています。
while : ; do _T1=$( /sbin/tc -s qdisc | fgrep -m 1 Sent | cut -d" " -f 3); sleep 1; _T2=$( /sbin/tc -s qdisc | fgrep -m 1 Sent | cut -d" " -f 3); echo "$(expr \( $_T2 - $_T1 \) \* 8 ) bps"; done
LANのインターフェースが複数あるサーバは注意してください。
上記ですと、一番最初のインターフェースが監視されます。
別インターフェースを監視したい場合は、 fgrep -mの引数をいじってあげるなどして調整してください。
bondingでRound Robinなどしている場合には、あまりお役に立てないかと思います。
実行結果
結果は以下の様な形で、一秒ごとのトラフィックが出力されます。bpsから単位を変えたい場合はexprあたりをいじってあげてください。
[sai@sai-pc ~]$ while : ; do _T1=$( /sbin/tc -s qdisc | fgrep -m 1 Sent | cut -d" " -f 3); sleep 1; _T2=$( /sbin/tc -s qdisc | fgrep -m 1 Sent | cut -d" " -f 3); echo "$(expr \( $_T2 - $_T1 \) \* 8 ) bps"; done
8734304 bps
8734400 bps
7997024 bps
( 環境: CentOS 5.3 )