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

发布于 2024-11-07 03:21:10 字数 69 浏览 4 评论 0原文

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

In /proc/pid/fd/, there are too many file descriptors. Can I use shell command to close these file descriptors?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

赢得她心 2024-11-14 03:21:10

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

首先,找到PID。

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

gdb -p 1598

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

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

如果文件描述符是泄漏的,那么程序将永远不会尝试再次使用它,而且它应该'不会引起任何问题。然而,该程序很可能有一个错误。

You can definitely close fd's of other running processes as long as you have the permissions to do so.

First, find the PID.

Then, start gdb and attach to the process:

gdb -p 1598

Then, call the close system call on the fd you want to close:

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

If the file descriptor was a leaked one, then the program will never try to use it again anyway, and it shouldn't cause any issues. The program most likely has a bug, however.

烟雨凡馨 2024-11-14 03:21:10

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

exec n<&-

You can close a FD n of the current process in bash as so:

exec n<&-
情话墙 2024-11-14 03:21:10

@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

请参阅 gdb 文档

有时,您想要调用的函数缺少调试信息。
在这种情况下,GDB不知道函数的类型,包括
函数参数的类型。避免称呼低人一等
函数不正确,这可能会导致被调用的函数
运行错误甚至崩溃,GDB拒绝调用
函数,除非你告诉它函数的类型。

对于原型(即 ANSI/ISO 风格)函数,有两种方法
这样做。最简单的是将调用强制转换为函数的声明
返回类型。

@Thomas answer is valid only when debug information for close() call is installed.

Without debug info installed, gdb refuses to call close():

(gdb) call close(3)
'close' has unknown return type; cast the call to its declared return type

The simplest way to make gdb call close() in this case is to cast the call to close() return type:

(gdb) call (int)close(3)
$1 = 0

See gdb documentation:

Sometimes, a function you wish to call is missing debug information.
In such case, GDB does not know the type of the function, including
the types of the function’s parameters. To avoid calling the inferior
function incorrectly, which could result in the called function
functioning erroneously and even crash, GDB refuses to call the
function unless you tell it the type of the function.

For prototyped (i.e. ANSI/ISO style) functions, there are two ways to
do that. The simplest is to cast the call to the function’s declared
return type.

半衾梦 2024-11-14 03:21:10

我也遇到过类似的情况,但 gdb 不是一个选项,因为它破坏了我的应用程序的实时约束并扭曲了我的测试。

所以我想出了一个快速的 iptables 规则。 将可选参数放入方括号中 ([ opt ])

  1. 查找您的目的地地址和端口

    netstat --program [ --numeric-host --numeric-ports ] |

    netstat --program [ --numeric-host --numeric-ports ] | grep []/[]

    <代码>$ netstat --program --numeric-ports | grep 8812/
    tcp 0 0 ysc.xxx:54055 10.56.1.152:30000 已建立 8812/my-application
    tcp 0 0 ysc.xxx:46786 postgres.xxx:5432 已建立 8812/my-application
    tcp 0 0 ysc.xxx:36090 10.56.4.79:57000 已建立 8812/my-application
                                          ...
    unix 2 [] DGRAM 7177020 8812/我的应用程序
    

    在这里,我想剪切10.56.4.79:57000

  2. 创建iptables规则来切断套接字

    iptables -A OUTPUT [ --out-interface; --协议] --destination <地址> --dport <端口> --jump DROP

    $ iptables -A 输出 --destination 10.56.4.79 --dport 57000 --jump DROP
    $
    
  3. 在此阶段,您的程序无法向远程主机发送数据包。在大多数情况下,TCP 连接已关闭。如果有的话,您可以继续进行测试。

    <代码>$ netstat --program --numeric-ports | grep 8812/
    tcp 0 0 ysc.xxx:54055 10.56.1.152:30000 已建立 8812/my-application
    tcp 0 0 ysc.xxx:46786 postgres.xxx:5432 已建立 8812/my-application
                                          ...
    unix 2 [] DGRAM 7177020 8812/我的应用程序
    
  4. 删除 iptables 规则

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

    $ iptables -D 输出 --destination 10.56.4.79 --dport 57000 --jump DROP
    $
    

I've ran in a similar situation, but where gdbwas not an option since it disrupted the real-time constraints of my application and distorted my test.

So I came up with a quick iptables rule. Optional arguments put into square brackets ([ opt ]).

  1. Find your destination address and port:

    netstat --program [ --numeric-host --numeric-ports ] | grep [<pid>]/[<appname>]

    $ netstat --program --numeric-ports | grep 8812/
    tcp        0      0 ysc.xxx:54055          10.56.1.152:30000           ESTABLISHED 8812/my-application
    tcp        0      0 ysc.xxx:46786          postgres.xxx:5432           ESTABLISHED 8812/my-application
    tcp        0      0 ysc.xxx:36090          10.56.4.79:57000            ESTABLISHED 8812/my-application
                                          ...
    unix  2      [ ]         DGRAM                    7177020 8812/my-application
    

    Here, I'd like to cut 10.56.4.79:57000.

  2. Create an iptables rule to cut the socket:

    iptables -A OUTPUT [ --out-interface <if> --protocol <tcp|udp|unix> ] --destination <addr> --dport <port> --jump DROP

    $ iptables -A OUTPUT --destination 10.56.4.79 --dport 57000 --jump DROP
    $
    
  3. At this stage, your program can't send packets to the distant host. In most cases, the TCP connection is closed. You can proceed with your tests if there is some.

    $ netstat --program --numeric-ports | grep 8812/
    tcp        0      0 ysc.xxx:54055          10.56.1.152:30000           ESTABLISHED 8812/my-application
    tcp        0      0 ysc.xxx:46786          postgres.xxx:5432           ESTABLISHED 8812/my-application
                                          ...
    unix  2      [ ]         DGRAM                    7177020 8812/my-application
    
  4. Remove the iptables rule:

    You just type in the same iptables rule replacing the A by a D.

    $ iptables -D OUTPUT --destination 10.56.4.79 --dport 57000 --jump DROP
    $
    
断爱 2024-11-14 03:21:10

您不能只是关闭其他进程的文件描述符并期望它们继续工作。

修复打开文件过多的程序,使其打开的文件较少。这可能是配置更改,或修改源等。您不能只是关闭它的文件。

You can't just go around closing other processes' file descriptors and expect them to keep working.

Fix the program which has too many files open to make it open fewer. This may be a config change, or modifying the source etc. You can't just close the files for it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文