由ftp傳輸腳本引發的服務器內存問題
監控如圖所示:
首先,登錄服務器,使用 “top” 命令查看當前較為占用內存的進程,發現排在前十的進程所占用的總內存也只有50%左右。於是,又通過 “ps aux” 命令查看所有進程,發現存在大量重復的進程,就是ftp進程,統計了一下,大約有3000多條,我想,這應該就是導致內存使用率持續升高的原因了。
ftp是由crontab定時運行的,每15分鐘執行一次傳輸任務,所以會產生這麽多進程也不奇怪。問題是,為什麽傳輸完成後進程也不會結束呢?難道ftp會話一直沒有關閉嗎?於是,手動執行ftp傳輸腳本,使用調試模式進行觀察,發現腳本運行過程中果然出現問題了 "passive mode refused" 。
問題截圖如下:
先使用如下命令把有關ftp的進程全部殺掉,然後觀察內存使用情況,發現內存使用率馬上就降下來了:
f
or i in
ps aux |grep "ftp -n" |grep -v grep |awk ‘{ print $2 }‘; do kill -9 $i; done
現在要解決的問題就是怎麽才能讓ftp進程在傳輸完成後正常結束,再次模擬了一下,確認了問題點:
問題提示為"passive mode refused",ftp分為兩種傳輸模式,主動模式和被動模式,ftp默認使用被動模式。聯想到前段時間ftp服務端做了嚴格的端口訪問限制,應該是只放通了21端口。因為ftp被動模式需要服務端也提供一個隨機端口給客戶端訪問,用以數據傳輸,所以現在ftp可以建立連接,但是不能進行數據傳輸。既然如此,將被動模式改為主動模式試一下:
腳本執行過程中,提示ftp被動模式關閉,然後文件能正常傳輸,在整個腳本執行完後,再查看進程,沒有發現殘留的ftp進程。如此,也可以推斷,ftp服務端是開啟了20和21端口給客戶端服務器訪問。
至此,問題解決,後續將持續觀察。
由ftp傳輸腳本引發的服務器內存問題