2016年5月18日 星期三

[issue] erron,24 Too many open files

 

程式在測試時經過一段時間,資料庫模組會印出”Failed to connect to database: Error: could not create socket: Too many open files” 然後就Aborted了。

2016-05-18_123312

依據網路查詢資料解釋,說明是因為開啟文件描述符(File descriptor) 超過上限,造成其他模組無法開啟所引發的錯誤。

有一個指令可以查看目前開啟的文件清單 –>  lsof

開始測試程式,使用指令加上過濾條件後,明顯看到會持續增加,因此判斷某個模組沒有進行釋放資源的動作。

2016-05-18_140239

檢查各個模組原始碼,發現有一自寫的網路連線偵測模組,它使用了socket 函式,但是卻在正常或異常返回時,沒有加入close 進行釋放動作,造成每次檢查就使用一個fd ,最終導致fd使用完畢程式崩潰。

 

P.S:搜尋資料時,發現這個問題也很容易於popen()上出現,主要是popen的shell執行有關,因此使用上也要小心。