2011-05-13 166 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