2013-06-01 17 views
2

我有一個進程在系統中運行24 * 7。據報道,這個過程已經開放了太多的插座,耗盡了它的最大限度。如何找到哪個函數打開socket?

[email protected]:/root> lsof -p 681 | grep -i sock | wc -l 
1018 
[email protected]:/root> 

strace的透露,其打開/關閉套接字每次迭代可是突然有通過沒有正確關閉的進程打開很多插座。

socket(PF_NETLINK, SOCK_DGRAM, 11)  = 485 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 486 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 487 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 488 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 489 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 490 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 491 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 492 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 493 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 494 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 495 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 496 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 497 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 498 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 499 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 500 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 501 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 502 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 503 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 504 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 505 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 506 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 507 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 508 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 509 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 510 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 511 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 512 
socket(0x1e /* PF_??? */, SOCK_SEQPACKET, 0) = 513 
close(513)        = 0 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 513 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 514 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 515 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 516 
socket(0x1e /* PF_??? */, SOCK_SEQPACKET, 0) = 517 
close(517)        = 0 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 517 
socket(PF_NETLINK, SOCK_DGRAM, 11)  = 518 

我的問題如何找出正在運行的進程的哪個函數創建了這個PF_NETLINK套接字?代碼太大,無法手動遵循所有可能的路徑。有什麼工具可以告訴我哪些功能創建了這些PF_NETLINK套接字?

任何幫助表示讚賞。

非常感謝。

+0

的['grep'(http://linux.die.net/man/1/grep)命令是一個很好的命令來快速搜索大量的文件。如果你在IDE中,那麼最有可能的是「搜索所有文件」功能。 –

+0

順便說一句,我希望你沒有經常以root身份登錄?這是一個相當大的安全漏洞。請考慮使用['sudo'](http://linux.die.net/man/8/sudo)運行真正需要它的程序。 –

+0

埃爾,不是漏洞,但這是一個很大的安全風險。 –

回答

1

在調試器下運行它,並在socket()中設置斷點。當斷點碰到時,做一個堆棧跟蹤。

+0

你的建議工作。當調用socket()時,GDB打印回溯。追溯時間很長,但幸運的是可以找出問題所在。非常感謝。 – tshah06

4

使用strace +和普通strace選項來跟蹤socket()系統調用。 它應該給你一個堆棧跟蹤到發出調用的源代碼行。 步驟來使用它現在的位置: http://code.google.com/p/strace-plus/

+0

Strace +確實很棒。但不幸的是,我的系統沒有這個工具,所以無法使用它。我的錯。但非常感謝,因爲我根本不知道這個工具。 – tshah06

+0

strace +未預包裝。您可以按照4個步驟進行安裝。請按照上述鏈接中的步驟進行安裝。 – VAT69

相關問題