Linux关闭文件命令:如何通过Linuxshell命令关闭文件描述符

关于Linux关闭文件命令的问题,在linux close中经常遇到, 在/proc/pid/fd/中,文件描述符太多,我可以使用 shell 命令关闭这些文件描述符吗?

/proc/pid/fd/中,文件描述符太多,我可以使用 shell 命令关闭这些文件描述符吗?

40

只要您有权限,您绝对可以关闭其他正在运行的进程的 fd。

首先,找到 PID。

然后,启动 gdb 并附加到进程:

gdb -p 1598

然后,在要关闭的 fd 上调用 close 系统调用:

(gdb) call close(999)
$1 = 0

如果文件描述符是一个泄漏的,那么程序将永远不会尝试再次使用它,它不应该导致任何问题。

9

您可以在 bash 中关闭当前进程的 FDn,如下所示:

exec n<&-
4

@ 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 样式)函数,有两种方法可以做到这一点。最简单的方法是将调用强制转换为函数声明的返回类型。

3

我在类似的情况下运行,但是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 theiptablesrule:

您只需输入相同的iptables规则,将A替换为D

$ iptables -D OUTPUT --destination 10.56.4.79 --dport 57000 --jump DROP
$

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(73)
游戏云服务器租用:是否可以在云的帮助下运行多人游戏服务器
上一篇
二叉树的代码:“完全二叉树”“严格二叉树”“完全二叉树”之间的区别
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(65条)