A进程总是连接B进程listen的1158端口,而且连接到断开的持续时间很短,由于知道1158端口,所以,B进程很容易被找到,现在不知道A进程是哪个,只知道是本机的某进程来连接1158端口的。
如何找到A进程呢?
对于持续时间不太短的连接,我们通常可以使用ss -anp来查看,但是对于持续时间足够短的连接,ss是不太容易抓到的。毕竟,当机器上进程数多的时候,每个连接都扫一遍所有的进程下的fd,会明显感觉很慢的。
所以,一种办法是:
不使用ss的-p选项,只使用ss -an,从结果中拿到感兴趣的端口后,再去/proc/*/fd/* 中找对应的fd,但是,进程的fd中对应的socket的id并不出现在ss的结果中,无法对应起来。
另一种办法:
直接去 /proc/net/tcp 中查找感兴趣的连接,基本逻辑如下:
1 2 3 4 5 6 7 8 9 |
while : ; do cat /proc/net/tcp |grep ":0486"|awk '$10 != 23774779 {print $10}' done | while read key;do echo $key; for fd in /proc/*/fd/*; do v=$(readlink $fd) [[ $v = socket*$key* ]] && { echo $fd $v ; } done done |
其中的 :0486 是我们感兴趣的端口号的16进制表示, 23774779 是我们不感兴趣的连接
其实,这样也未必能抓到感兴趣的连接,毕竟连接消失的太快。
比较靠谱的办法是:
1 |
kill -19 $pid_of_B |
让B进程休眠,这样,A进程进入的连接不能被及时处理,就不会立即断开,然后使用ss -anp就可以了,除非A进程设置了非常短的超时,那么,可能我们就需要研究一下systemtap了