回答:
あなたが始めるための何か(あなたが自分でそれを書きたい場合に備えて):
#!/bin/bash
#
# usage: bwmon PID
IN=0; OUT=0; TIME=0
get_traffic() {
t=`awk '/eth0:/ { printf("%s,%d,%d\n",strftime("%s"),$2,$10); }' < /proc/$1/net/dev`
IN=${t#*,}; IN=${IN%,*}
OUT=${t##*,};
TIME=${t%%,*};
}
get_traffic $1
while true
do
_IN=$IN; _OUT=$OUT; _TIME=$TIME
get_traffic $1
echo "$TIME,$(( $TIME - $_TIME )),$IN,$(( $IN - $_IN )),$OUT,$(( $OUT - $_OUT))"
sleep 1
done
コメント:
stat --printf="%N\n" /proc/PID/exe | cut -d ' ' -f 3
nc
localhostでクライアント/サーバーのペアを実行し、1秒あたり1バイトを送信して監視しました/proc/<listening-nc-pid>/net/dev
。次に、2番目のnc
ペアを実行し、最大レートで送信しました。私が見ていたファイルは、明らかに2番目のペアのデータと最初のペアのデータをカウントしました。Linux 2.6.32で実行しています。
function strftime never defined
。gawkをインストールすることで修正されました。
/proc/<pid>/net/dev
そして/proc/net/dev
ここに同じ内容があります。したがって、sciptは、特定のプロセスではなく、eth0のトラフィックのみを報告します。
eth0
プロセスで見られるように、のインターフェイスカウンターを測定します。そのインターフェイスを介してプロセスによって送信されたデータはカウントされません。
使用される一般的なI / O帯域幅に満足している場合(またはプログラムがほぼ完全にネットワークI / Oを行う場合)、/proc/<pid>/io
ファイルを監視できます。rchar
とwchar
フィールドが必要です。あなたは減算することをお勧めしますread_bytes
とwrite_bytes
、彼らは読み込み、ストレージ層への書き込みを表しているので、。http://www.kernel.org/doc/Documentation/filesystems/proc.txtのセクション3.3を参照してください。
さらに解像度が必要な場合は...とを使用lsof
してスクリプトを作成することもできますがstrace
、すべてのコーナーケースを正しく行うのは苦痛です。基本的な考え方は、出力解析することですstrace -p <pid>
、最初のパラメータをつかん(=ファイルディスクリプタ)からの戻り値(=バイト数)read()
、write()
、send()
、およびrecv()
コール(注 I避難所」;をリッスンするには、いくつかのより多くのシステムコールがあるがtはそれらをすべて追跡しました)。負の値を破棄します。エラーを示しています。lsof -p <pid>
どのファイル記述子がTCP / UDPソケットであるかを把握し、fdごとのカウントを合計するために使用します。検査しているプロセスを所有している限り、この戦略はルートを必要としませんが、うまく書くことはもちろん、書くのは本当に難しいでしょう。
NetHogsは小さな「ネットトップ」ツールです。ほとんどのツールのように、プロトコルごとまたはサブネットごとにトラフィックを分類する代わりに、プロセスごとに帯域幅をグループ化します。NetHogsは、ロードされる特別なカーネルモジュールに依存しません。突然大量のネットワークトラフィックが発生した場合は、NetHogsを起動して、どのPIDがこれを引き起こしているかをすぐに確認できます。これにより、ワイルドになり、突然帯域幅を占有しているプログラムを簡単に特定できます。