1. 程式人生 > >java.net.BindException: Cannot assign requested address 你所不知道的另一個原因(linux)

java.net.BindException: Cannot assign requested address 你所不知道的另一個原因(linux)

轉載:https://blog.csdn.net/zqz_zqz/article/details/79736498

剛剛通過qq幫同事處理了一個客戶執行緒問題,都這麼晚了,還在現場部署應用,真實夠拼的,客戶不能連線外網,不能下載檔案,只能通過手機拍照錯誤日誌排查問題;

問題現象就是tomcat起不來,上來給我發了好幾張錯誤日誌照片,類似下面這樣:

憑經驗,一看就是某些原因導致tomcat啟動失敗,執行關閉操作報的一堆警告,所以讓他去找tomcat啟動後第一處異常,拍照如下:

這個異常報錯是

org.apache.catalina.core.StandardServer.await StandardServer.await: create[localhost:18005]

    java.net.BindException: Cannot assign requested address

一看懷疑是18005 埠被佔用了無法繫結;這個好說,執行命令netstat -antp|grep 18005 看哪個程序佔用了18005埠直接幹掉它,啟動就完事了,但是譚明飛告訴我,技術支援說沒有佔用18005埠的程序;

於是百度谷歌了一通,總結起來有兩種可能 :

1. 短時間內大量的socket連線建立並結束,導致很多TIME_WAIT埠沒來及釋放,埠被佔用光了。解決方案,要麼重用socket連線,要麼開啟sockets的快速回收:sysctl -w net.ipv4.tcp_tw_recycle=1;

2.本機host配置有誤, 出現這個問題的使用者,都是將localhost對映成了一個不存在的ip地址,更改成127.0.0.1後就ok了;

情況1不可能,技術支援正在部署應用,還沒有啟動成功,怎麼會有大量socket連線,為了以防萬一,專門使用下面的命令:

netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'

統計了一下tcpip的狀態,發現全都是ESTABLISHED狀態,連線才有76個,如下圖:

又檢查/etc/hosts配置檔案,發現配置正確;

根據列印日誌的第一行

org.apache.catalina.core.StandardServer.await StandardServer.await: create[localhost:18005]

伺服器是在訪問localhost:18005 , 判斷可能和第二條有些關聯,但是未必是hosts配置錯誤導致的問題,於是讓技術支援ping一下localhost看看ip地址是不是127.0.0.1,結果發現ping命令卡住,無法ping通:

第一反應就是客戶禁止ping了,於是執行以下命令,解除禁止:

 echo 0 >/proc/sys/net/ipv4/icmp_echo_ignore_all

執行後發現仍然ping不通;同時技術支援發現不但localhost地址ping不通,本機地址也一樣ping不通:

但是從別的伺服器上ping這臺機器,和從這臺機器ping別的機器是能通的;

後來讓技術支援執行下ifconfig命令看下本機的ip地址:

發現竟然沒有lo 迴路地址,難道問題在這?馬上百度了一下lo迴路地址,發現它有一個配置檔案:

/etc/sysconfig/network-scripts/ifcfg-lo

提示檔案不存在,於是按照正常機器樣本重建這個檔案後,問題解決;
--------------------- 
作者:朱清震 
來源:CSDN 
原文:https://blog.csdn.net/zqz_zqz/article/details/79736498 
版權宣告:本文為博主原創文章,轉載請附上博文連結!