博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何在线关闭一个tcp socket连接
阅读量:4284 次
发布时间:2019-05-27

本文共 1220 字,大约阅读时间需要 4 分钟。

你可能会说,简单, netstat -antp 找到连接, kill 掉这个进程就行了。

# netstat -antp|grep 6789tcp        0      0 1.1.1.1:59950      1.1.1.2:6789        ESTABLISHED 45059/ceph-fuse# kill 45059

连接确实关掉了,进程也跟着一起杀死了。达不到“在线”的要求。

有没有办法不杀死进程,但还是可以关闭socket连接呢?

我们知道,在编码的时候,要关闭一个socket,只要调用 close 函数就可以了,但是进程在运行着呢,怎么让它调用 close 呢?

在  上看到一个很棒的方法,原理就是 gdb attach 到进程上下文,然后 call close($fd) 。

1、 使用 netstat 找到进程

# netstat -antp|grep 6789tcp        0      0 1.1.1.1:59950      1.1.1.2:6789        ESTABLISHED 45059/ceph-fuse

如上,进程pid为45059。

2、 使用 lsof 找到进程45059打开的所有文件描述符,并找到对应的socket连接

lsof -np 45059COMMAND     PID USER   FD   TYPE             DEVICE SIZE/OFF       NODE NAMEceph-fuse 45059 root  rtd    DIR                8,2     4096          2 /ceph-fuse 45059 root  txt    REG                8,2  6694144    1455967 /usr/bin/ceph-fuseceph-fuse 45059 root  mem    REG                8,2   510416    2102312 /usr/lib64/libfreeblpriv3.so...ceph-fuse 45059 root   12u  IPv4         1377072656      0t0        TCP 1.1.1.1:59950->1.1.1.2:smc-https (ESTABLISHED)

其中 12u 就是上面对应socket连接的文件描述符。

3、 gdb 连接到进程

gdb -p 45059

4、 关闭socket连接

(gdb) call close(12u)

socket连接就可以关闭了,但是进程 45059 还是好好着的。

你可能会问,什么时候会用到这个特性呢?场景还是比较多的,比如你想测试下应用是否会自动重连mysql,通过这个办法就可以比较方便的测试了。

Ref:

转载地址:http://cyngi.baihongyu.com/

你可能感兴趣的文章
springboot中mybaits自动返回新增数据的主键
查看>>
shiro的使用freemark实现前端控制权限
查看>>
权限管理系统中功能权限&数据权限以及权限模块的实现
查看>>
shiro中LoginUrl与UnauthorizedUrl的作用
查看>>
权限管理系统之数据权限表RBAC
查看>>
shiro权限执行逻辑流程
查看>>
使用Aop实现日志记录
查看>>
shiro中数据字典管理
查看>>
shiro中考勤部门的管理
查看>>
基于idea+session组件+wagon实现打包部署
查看>>
shiro的总结篇
查看>>
在linux服务器上使用软连接进行启动jar包
查看>>
linux中查看磁盘是否使用沾满
查看>>
linux同一台机器安装两台nginx
查看>>
让es进行后端进程的方式启动
查看>>
es2.4.5 离线安装head插件
查看>>
实战项目经验得到的常用linux命令(-)
查看>>
Mysql的设计规范和结构优化(-)
查看>>
查看是否安装mysql以及是否正在运行的mysql
查看>>
题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存)。
查看>>