内容简介:你可能会说,简单,连接确实关掉了,进程也跟着一起杀死了。达不到“在线”的要求。有没有办法不杀死进程,但还是可以关闭socket连接呢?
你可能会说,简单, netstat -antp
找到连接, kill
掉这个进程就行了。
# netstat -antp|grep 6789 tcp 0 0 1.1.1.1:59950 1.1.1.2:6789 ESTABLISHED 45059/ceph-fuse # kill 45059
连接确实关掉了,进程也跟着一起杀死了。达不到“在线”的要求。
有没有办法不杀死进程,但还是可以关闭socket连接呢?
我们知道,在编码的时候,要关闭一个socket,只要调用 close 函数就可以了,但是进程在运行着呢,怎么让它调用 close 呢?
在 superuser
上看到一个很棒的方法,原理就是 gdb attach
到进程上下文,然后 call close($fd)
。
1、 使用 netstat
找到进程
# netstat -antp|grep 6789 tcp 0 0 1.1.1.1:59950 1.1.1.2:6789 ESTABLISHED 45059/ceph-fuse
如上,进程pid为45059。
2、 使用 lsof 找到进程45059打开的所有文件描述符,并找到对应的socket连接
lsof -np 45059 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ceph-fuse 45059 root rtd DIR 8,2 4096 2 / ceph-fuse 45059 root txt REG 8,2 6694144 1455967 /usr/bin/ceph-fuse ceph-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:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Oracle连接启动和关闭模式(汇总)
- BeeCP 2.4.3 发布,增加连接安全关闭
- 【译】 WebSocket 协议第七章——关闭连接(Closing the Connection)
- golang 网络编程之如何正确关闭tcp连接以及管理它的生命周期
- Android获取软键盘的高度、键盘的打开与关闭、监听键盘处于打开还是关闭状态
- 关于python关闭
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Mastering Regular Expressions, Second Edition
Jeffrey E F Friedl / O'Reilly Media / 2002-07-15 / USD 39.95
Regular expressions are an extremely powerful tool for manipulating text and data. They have spread like wildfire in recent years, now offered as standard features in Perl, Java, VB.NET and C# (and an......一起来看看 《Mastering Regular Expressions, Second Edition》 这本书的介绍吧!