在/proc/pid/fd/
中,文件描述符太多,我可以使用 shell 命令关闭这些文件描述符吗?
只要您有权限,您绝对可以关闭其他正在运行的进程的 fd。
首先,找到 PID。
然后,启动 gdb 并附加到进程:
gdb -p 1598
然后,在要关闭的 fd 上调用 close 系统调用:
(gdb) call close(999)
$1 = 0
如果文件描述符是一个泄漏的,那么程序将永远不会尝试再次使用它,它不应该导致任何问题。
您可以在 bash 中关闭当前进程的 FDn
,如下所示:
exec n<&-
@ Thomas 答案仅在安装了close()
调用的调试信息时才有效。
没有安装调试信息,gdb 拒绝调用close()
:
(gdb) call close(3)
'close' has unknown return type; cast the call to its declared return type
在这种情况下,使 gdb 调用close()
的最简单方法是将调用强制转换为close()
返回类型:
(gdb) call (int)close(3)
$1 = 0
See gdbdocumentation:
为了避免错误地调用次函数,这可能会导致被调用的函数错误运行甚至崩溃,GDB 拒绝调用该函数,除非你告诉它函数的类型。
对于原型(即 ANSI / ISO 样式)函数,有两种方法可以做到这一点。最简单的方法是将调用强制转换为函数声明的返回类型。
我在类似的情况下运行,但是gdb
不是一个选项,因为它了我的应用程序的实时约束并扭曲了我的测试。
所以我想出了一个快速的iptables
规则。可选参数放入方括号([ opt ]
)。
查找您的目标地址和端口:
netstat--program [--numeric-host--numeric-ports ] | grep [<pid>]/[<appname>]
$ netstat --program --numeric-ports | grep 8812/
tcp 0 0 ysc.:54055 10.56.1.152:30000 ESTABLISHED 8812/my-application
tcp 0 0 ysc.:46786 postgres.:5432 ESTABLISHED 8812/my-application
tcp 0 0 ysc.:36090 10.56.4.79:57000 ESTABLISHED 8812/my-application
...
unix 2 [ ] DGRAM 7177020 8812/my-application
在这里,我想剪切10.56.4.79:57000
。
创建iptables
规则以剪切套接字:
iptables-A OUTPUT [--out-intece <if>--protocol <tcp|udp|unix>]--destination <addr>--dport <port>--jump DROP
$ iptables -A OUTPUT --destination 10.56.4.79 --dport 57000 --jump DROP
$
在此阶段,您的程序无法将数据包发送到远程主机。在大多数情况下,TCP 连接已关闭。如果有一些测试,您可以继续进行测试。
$ netstat --program --numeric-ports | grep 8812/
tcp 0 0 ysc.:54055 10.56.1.152:30000 ESTABLISHED 8812/my-application
tcp 0 0 ysc.:46786 postgres.:5432 ESTABLISHED 8812/my-application
...
unix 2 [ ] DGRAM 7177020 8812/my-application
Remove theiptables
rule:
您只需输入相同的iptables
规则,将A
替换为D
。
$ iptables -D OUTPUT --destination 10.56.4.79 --dport 57000 --jump DROP
$
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(65条)