linux如何获得一个进程的网络流量 linux下面有什么工具可以查看每个进程的网络流量
linux\u4e0b\u9762\u6709\u4ec0\u4e48\u5de5\u5177\u53ef\u4ee5\u67e5\u770b\u6bcf\u4e2a\u8fdb\u7a0b\u7684\u7f51\u7edc\u6d41\u91cf\uff1fiftop \u5f88\u5f3a\u5927\u7684\uff0c\u5b8c\u5168 \u53ef\u4ee5\u505a\u5230
-i\u8bbe\u5b9a\u76d1\u6d4b\u7684\u7f51\u5361\uff0c\u5982\uff1a# iftop -i eth1
-B \u4ee5bytes\u4e3a\u5355\u4f4d\u663e\u793a\u6d41\u91cf(\u9ed8\u8ba4\u662fbits)\uff0c\u5982\uff1a# iftop -B
-n\u4f7fhost\u4fe1\u606f\u9ed8\u8ba4\u76f4\u63a5\u90fd\u663e\u793aIP\uff0c\u5982\uff1a# iftop -n
-N\u4f7f\u7aef\u53e3\u4fe1\u606f\u9ed8\u8ba4\u76f4\u63a5\u90fd\u663e\u793a\u7aef\u53e3\u53f7\uff0c\u5982: # iftop -N
-F\u663e\u793a\u7279\u5b9a\u7f51\u6bb5\u7684\u8fdb\u51fa\u6d41\u91cf\uff0c\u5982# iftop -F 10.10.1.0/24\u6216# iftop -F 10.10.1.0/255.255.255.0
-h\uff08display this message\uff09\uff0c\u5e2e\u52a9\uff0c\u663e\u793a\u53c2\u6570\u4fe1\u606f
-p\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u540e\uff0c\u4e2d\u95f4\u7684\u5217\u8868\u663e\u793a\u7684\u672c\u5730\u4e3b\u673a\u4fe1\u606f\uff0c\u51fa\u73b0\u4e86\u672c\u673a\u4ee5\u5916\u7684IP\u4fe1\u606f;
-b\u4f7f\u6d41\u91cf\u56fe\u5f62\u6761\u9ed8\u8ba4\u5c31\u663e\u793a;
-f\u8fd9\u4e2a\u6682\u65f6\u8fd8\u4e0d\u592a\u4f1a\u7528\uff0c\u8fc7\u6ee4\u8ba1\u7b97\u5305\u7528\u7684;
-P\u4f7fhost\u4fe1\u606f\u53ca\u7aef\u53e3\u4fe1\u606f\u9ed8\u8ba4\u5c31\u90fd\u663e\u793a;
-m\u8bbe\u7f6e\u754c\u9762\u6700\u4e0a\u8fb9\u7684\u523b\u5ea6\u7684\u6700\u5927\u503c\uff0c\u523b\u5ea6\u5206\u4e94\u4e2a\u5927\u6bb5\u663e\u793a\uff0c\u4f8b\uff1a# iftop -m 100M
ntop\u6216bandwitch\u5f97\u5230\u7aef\u53e3\u7684\u6d41\u91cf\u3002\u800c\u8fdb\u7a0b\u95f4\u7684\u7f51\u7edc\u901a\u8baf\u662f\u4f9d\u9760\u7aef\u53e3\u7684\uff0c\u8fd9\u6837\u4e5f\u5c31\u5f97\u5230\u4e86\u8fdb\u7a0b\u7684\u6d41\u91cf\u3002\u4f46\u662f\u5bf9\u4e8e\u52a8\u6001\u7aef\u53e3\u7684\u8fdb\u7a0b\u8fd9\u4e2a\u662f\u6709\u96be\u5ea6\u7684\u3002
Linux下是没有文件直接给你按进程记录流量信息的。你想要编程实现的话,办法是有的,只是比较麻烦。首先,你需要能截取流经网卡的数据包,这个可以通过libpcap来完成,其次你要完成的最重要的一步就是怎么根据端口号找到进程的pid。端口号通过截取的数据包可以获得,这个时候你要按行来解析/proc/net/tcp (如果要支持ipv6的话还要解析/proc/net/tcp6),这个文件记录了当前活跃的TCP连接情况,每一行代表一条连接,我们感兴趣的是其中的inode这一项,你得把inode的值解析出来保存。然后蛋疼的时候来了,接下来你得遍历所有的/proc/pid/fd文件,察看其中每一个文件描述符,如果发现内容为socket[xxxx]的,把xxxx截取出来,这个xxxx也是inode号,如果和你之前解析/proc/net/tcp的inode号吻合,恭喜你,这说明这个pid和那个tcp连接有关系,进而也就确定了端口号和pid的对应关系,也就知道了数据包和进程之间的对应关系了。
我的建议:
先看看http://www.tcpdump.org/pcap.html, 熟悉一下libpcap库的用法,怎么截取数据包。
自己看看/proc/net/tcp的内容,想想怎么做文本解析,除了inode外,源ip,源端口号,目的ip,目的端口号都可以解析出来,而这个四元组实际就代表了一条tcp连接。
想想怎么做数据包,连接,进程的老化超时处理。比如说,当前截取的到的数据包在统计过一次流量后,下一次就不应该再计入了,怎么处理?一条连接长时间没有任何数据包的交互,怎么老化掉?一个进程长时间没有数据包的交互,甚至用户给关闭了,你的程序如何感知?libpcap截取到数据包后会给你提供截取到的时间戳,好好利用这个时间戳就可以办到。
最后,以数据包 -> 连接 -> 进程 的关系来思考会有助于你的程序设计,一条连接可以有N个数据包,一个进程可以有N条连接。这么一想,这3个结构体或者类就能定义好了。剩下的自己琢磨琢磨。
使用命令iptraf可以实现你的功能。还可以基于端口
我在.NET下写了个C#的,不过Linux也一样的原理,通过netstat来实现的,建议先查看netsta的命令,他能够直接输出tcp/udp连接及对应的pid和进程名
绛旓細棣栧厛锛屼綘闇瑕佽兘鎴彇娴佺粡缃戝崱鐨勬暟鎹寘锛岃繖涓彲浠ラ氳繃libpcap鏉ュ畬鎴锛屽叾娆′綘瑕佸畬鎴愮殑鏈閲嶈鐨勪竴姝ュ氨鏄庝箞鏍规嵁绔彛鍙锋壘鍒拌繘绋嬬殑pid銆傜鍙e彿閫氳繃鎴彇鐨勬暟鎹寘鍙互鑾峰緱锛岃繖涓椂鍊欎綘瑕佹寜琛屾潵瑙f瀽/proc/net/tcp (濡傛灉瑕佹敮鎸乮pv6鐨勮瘽杩樿瑙f瀽/proc/net/tcp6)锛岃繖涓枃浠惰褰曚簡褰撳墠娲昏穬鐨凾CP杩炴帴鎯呭喌锛屾瘡涓琛屼唬琛...
绛旓細娌″姙娉曟煡鐪杩涚▼鐨缃戦燂紝鍙互鐪嬪綋鍓嶇殑缃戦熸祦閲 浣跨敤iftop鍛戒护锛涘畨瑁卛ftop,濡傛灉榛樿鎵句笉鍒板氨瀹夎涓猠pel婧愶紙姝ゅ鏄痗entos6鐨勶級cd /usr/local/srcwget http://mirrors.sohu.com/fedora-epel/6/i386/epel-release-6-8.noarch.rpmrpm -ivh epel-release-6-8.noarch.rpmyum clean allyum makecache yum -...
绛旓細浣跨敤lsof鍛戒护锛屾瘮濡傛煡鐪媠shd杩欎釜绋嬪簭鐨勭綉缁滆繛鎺ヤ娇鐢ㄥ懡浠 root@debian:~# lsof -i | grep ^sshdsshd 619 root 3u IPv4 19587 0t0 TCP *:ssh (LISTEN)sshd 619 root 4u IPv6 19589 0t0 TCP *:ssh (LISTEN)sshd 950 root 3u IPv4 21717 0t0 ...
绛旓細涓銆佸湪Linux涓锛屽鏋滆璁杩涚▼鍦ㄥ悗鍙拌繍琛岋紝涓鑸儏鍐典笅锛屾垜浠湪鍛戒护鍚庨潰鍔犱笂&鍗冲彲锛屽疄闄呬笂锛岃繖鏍锋槸灏嗗懡浠ゆ斁鍏ュ埌涓涓浣滀笟闃熷垪涓簡锛./test.sh & [1] 17208 $ jobs -l [1]+ 17208 Running ./test.sh & 浜屻佸浜庡凡缁忓湪鍓嶅彴鎵ц鐨勫懡浠わ紝涔熷彲浠ラ噸鏂版斁鍒板悗鍙版墽琛岋紝棣栧厛鎸塩trl+z鏆傚仠宸茬粡杩愯...
绛旓細鏌ョ湅linux杩涚▼鍗犵敤绔彛姝ラ濡備笅锛歭sof -i 鐢ㄤ互鏄剧ず绗﹀悎鏉′欢鐨勮繘绋嬫儏鍐碉紝lsof(list open files)鏄涓涓鍒楀嚭褰撳墠绯荤粺鎵撳紑鏂囦欢鐨勫伐鍏枫備互root鐢ㄦ埛鏉ユ墽琛宭sof -i鍛戒护锛屽涓嬪浘 lsof -i:绔彛鍙凤紝鐢ㄤ簬鏌ョ湅鏌愪竴绔彛鐨勫崰鐢ㄦ儏鍐碉紝姣斿鏌ョ湅22鍙风鍙d娇鐢ㄦ儏鍐碉紝lsof -i:22锛屽涓嬪浘 netstat -tunlp鐢ㄤ簬鏄剧ずtcp锛寀dp...
绛旓細鈥淪ID鈥濇爮琛ㄧず绾跨▼ID锛岃屸淐MD鈥濇爮鍒欐樉绀轰簡绾跨▼鍚嶇О銆傛柟娉曚簩锛 Top top鍛戒护鍙互瀹炴椂鏄剧ず鍚勪釜绾跨▼鎯呭喌銆傝鍦╰op杈撳嚭涓紑鍚嚎绋嬫煡鐪嬶紝璇疯皟鐢╰op鍛戒护鐨勨-H鈥濋夐」锛岃閫夐」浼氬垪鍑烘墍鏈Linux绾跨▼銆傚湪top杩愯鏃讹紝浣犱篃鍙互閫氳繃鎸夆淗鈥濋敭灏嗙嚎绋嬫煡鐪嬫ā寮忓垏鎹负寮鎴栧叧銆倀op -H 瑕佽top杈撳嚭鏌愪釜鐗瑰畾杩涚▼<pid>骞...
绛旓細1锛変娇鐢╨sof鍛戒护 lsof鏄涓涓闈炲父寮哄ぇ鐨linux宸ュ叿锛屽ス琚敤鏉ユ煡鎵惧摢浜涚▼搴忎娇鐢ㄤ簡閭d簺鏂囦欢銆傚湪linux绯荤粺涓嬶紝鍩烘湰涓婃墍鏈夌殑涓滆タ閮藉彲浠ヨ褰撲綔鏂囦欢鏉ョ敤銆俿ocket褰撶劧涔熸槸涓绉嶆枃浠朵簡銆傛墍浠sof鍙互鐢ㄦ潵鏌ユ壘璋佺敤浜嗘煇涓涓鍙c傚叿浣撴柟娉曪細lsof -i :port_number |grep "(LISTEN)"-i鏄敤鏉ユ煡鎵惧拰缃戠粶鐩稿叧鐨勬枃浠讹紝":"...
绛旓細鍏堢敤ps鐪嬬洰鍓嶅瓨鍦ㄧ殑鎵鏈杩涚▼鐨杩涚▼鍙凤紝鐒跺悗鍙互瀵瑰叿浣撹繘绋嬮噰鐢ㄤ互涓嬭繖浜涙搷浣滐細锛11345灏辨槸瀵瑰簲鍏蜂綋鐨勮繘绋嬪彿锛夊彧鏌ョ湅璇ヨ繘绋嬶細ps -ef | grep 11345 鏌ョ湅璇ヨ繘绋嬫墦寮鐨勬枃浠讹細lsof -p 11345 鏌ョ湅鍐呭瓨鍒嗛厤锛歭cat /proc/11345/maps 鏌ョ湅鍫嗘爤锛歱stack 11345 鏌ョ湅鍙戝嚭鐨勭郴缁熻皟鐢:strace -p 11345 鏌ョ湅璋冪敤搴撳嚱鏁:...
绛旓細涓夌鏂规硶锛1銆 浣跨敤top鍛戒护锛屽叿浣撶敤娉曟槸 top -H 鍔犱笂杩欎釜閫夐」锛宼op鐨勬瘡涓琛屽氨涓嶆槸鏄剧ず涓涓繘绋锛岃屾槸涓涓嚎绋嬨2銆 浣跨敤ps鍛戒护锛屽叿浣撶敤娉曟槸 ps -xH 杩欐牱鍙互鏌ョ湅鎵鏈夊瓨鍦ㄧ殑绾跨▼锛屼篃鍙互浣跨敤grep浣滆繘涓姝ョ殑杩囨护銆3銆 浣跨敤ps鍛戒护锛屽叿浣撶敤娉曟槸 ps -mq PID 杩欐牱鍙互鐪嬪埌鎸囧畾鐨勮繘绋嬩骇鐢熺殑绾跨▼鏁扮洰銆傛洿...
绛旓細Linux涓鏌ユ壘琚繘绋嬩娇鐢ㄧ殑鎵鏈夋枃浠讹紝鍙互浣跨敤lsof鍛戒护锛屼絾鏄粯璁ゆ儏鍐典笅lsof浼氬皢绯荤粺涓婂凡缁忔墦寮鐨勬枃浠堕兘鍒楀嚭鏉ワ紝鎵浠ュ父甯搁渶瑕佺敤绠¢亾绗﹀姞grep鍛戒护锛岄夊彇鎸囧畾鐨杩涚▼鐨淇℃伅锛屾瘮濡傚涓嬪懡浠ゅ垪鍑篿nit杩涚▼鍦ㄤ娇鐢ㄥ摢浜涙枃浠讹細lsof | grep init