追踪快速消失的TCP连接
有些时候,Linux系统上会发起一些TCP连接,但很快就结束。传统的netstat、ss或者lsof这类工具很难追踪到是谁(UID)或者哪一个程序(binary)发起的。我觉得perf可以追踪到,但是还不知道具体该怎么操作。
看了一下perf的文档,看来至少在CentOS 6.x上perf是行不通的。没有相关的追踪点。又查了一下ss,至少下面这个小脚本可以达到我的目的:
找出到底是哪个用户、什么进程在连接某个特定的端口/IP:
[root@sc-perf02 logfiles]$ while (true) do myid=$(ss -tpn '( dport = :3476 or dport = :3477 )' | grep -v State|awk '{print $NF}' |awk -F"," '{print $2}'); if [ "X$myid" != "X" ];then ps -f -www -p $myid ;fi;sleep 1;done UID PID PPID C STIME TTY TIME CMD zabbix 10424 9648 5 11:47 ? 00:00:00 /opt/perforce/bin/python/3.4.2/bin/python3 /opt/perforce/scripts/zabbix-p4-synth-check.py --port p4-ac-data-apac-edge01.example.org:3477 --proxy UID PID PPID C STIME TTY TIME CMD zabbix 10937 9648 0 11:48 ? 00:00:00 /opt/perforce/bin/python/3.4.2/bin/python3 /opt/perforce/scripts/zabbix-p4-synth-check.py --port p4-ac-data-apac-edge01.example.org:3477 --proxy
这个脚本的逻辑在于,使用while循环运行ss -tpn '(dport = :3476 or dport = :3477)'
,这个命令可以检查是否又向外连接3476或3477端口的socket,如果有的话,它会输出相关的进程的程序名称(python3,如下),PID (17939)。
State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 10.233.47.202:53670 10.194.101.69:3477 users:(("python3",17939,7))
然后使用一串grep、awk命令获取PID,如果找到的话就运行ps -f -www -p $PID
,然后就可以看到哪个用户,哪个程序发起了这个特定的连接。