2011-05-13 168 views

回答

4

您可以在bash关闭当前程序的FD n像这样:

exec n<&- 
+0

谢谢。但它用于关闭当前进程的FD(bash进程)。你知道关闭特定过程的FD的方法吗? – Eric 2011-05-13 08:07:52

0

你不能只是到处去关闭其他进程的文件描述符,并希望他们继续工作。

修复打开了太多文件的程序,使其打开的次数减少。这可能是一个配置更改,或修改源等你不能只关闭它的文件。

+8

当然可以。想要这样做的一个常见情况是因为程序泄漏了fd;在这种情况下,它不会再使用它们。当然,这是一个错误,但想要解决它仍然是有效的。 – 2012-08-21 15:10:26

+0

在我的情况下,我有一个长时间运行的挂起批处理过程,因为从http套接字读取已经死亡。关闭fd作为@ThomasVanderStichele描述为我解决了这个问题:-) – 2015-03-31 00:45:15

24

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

首先找到PID。

然后,启动gdb并且连接到进程:

gdb -p 1598 

然后,打电话要关闭FD上的close系统调用:

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

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

2

我跑了类似的情况,但其中gdb不是一个选项,因为它破坏了我的应用程序的实时约束和扭曲我的测试。

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

  1. 找到你的IP地址和端口

    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 
    

    在这里,我想削减10.56.4.79:57000

  2. 创建iptables规则切断插座

    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. 在这个阶段,你的程序不能将数据包发送到遥远的主机。在大多数情况下,TCP连接已关闭。如果有的话,你可以继续进行测试。

    $ 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. 取出iptables规则

    您只需键入相同iptables规则由D更换A

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

请注意,我的意图是测试如果我的应用程序如果失去与关键服务的连接,它将如何反应。 – YSC 2016-02-23 08:38:24