如果一路是風(fēng)平浪靜尚卫,那么旅途是單調(diào)無味的归榕。
在技術(shù)領(lǐng)域,尤其是軟件開發(fā)行業(yè)吱涉,技術(shù)問題或bug常被戲稱為坑刹泄。技術(shù)坑讓人癡迷外里、抓狂、驚喜特石、沮喪盅蝗、郁悶,但終究令我在痛并快樂中快速成長姆蘸。
最近團隊利用前后臺分離開發(fā)一個項目墩莫,前端采用bootstrap + angular 1 + bower + grunt,后端采用spring boot逞敷。開發(fā)接近尾聲狂秦,今天打算部署項目至客戶的線上服務(wù)器,邀請客戶一起參與內(nèi)測推捐。線上的環(huán)境為Cent OS 7.0 64位裂问。在前端構(gòu)建環(huán)境安裝完畢之后,執(zhí)行命令<code>grunt build</code>構(gòu)建時玖姑,出現(xiàn)一個task warning:<code>Running "ngtemplates:dist" (ngtemplates) task killed</code>愕秫。后續(xù)的構(gòu)建任務(wù)因這個warning而被終止。
看到這個warning事焰络,自己腦海里一片空白戴甩。之前從未遇到過這樣的問題,而且warning的信息給得太簡短闪彼,根本找不到任何頭緒甜孤。開始以為是任務(wù)<code>ngtemplates:dist" (ngtemplates)</code>的構(gòu)建腳本有問題,但這個構(gòu)建腳本在測試服務(wù)器上執(zhí)行過成千上萬次畏腕,并未出現(xiàn)過任何問題缴川,所以可以初步排除腳本的原因。
那么可能是什么原因產(chǎn)生的呢描馅?利用萬能的網(wǎng)絡(luò)搜索把夸,希望馬上找到該問題的解決辦法。但在嘗試了變換幾次關(guān)鍵字之后铭污,仍舊沒有找到類似問題的解決辦法恋日,就連類似的問題都很少有人提及。到底是什么原因引起的呢嘹狞?做技術(shù)的朋友岂膳,尤其熟悉linux環(huán)境以及擅長前端的伙伴們,可以馬上花三分鐘想想可能的原因在哪里磅网。
以下內(nèi)容強烈建議在思考三分鐘之后閱讀
三分鐘谈截,自己沒有思考出任何結(jié)果來,仍然是一片空白。如果你也是此類人簸喂,那么不要驚恐毙死,你不孤單。
自己繼續(xù)利用搜索工具查找是否有類似問題的信息娘赴,希望從類似的問題找到解決辦法规哲。技術(shù)的坑太多,網(wǎng)上分享的只是其中的一部分诽表,是冰山一角。但技術(shù)原理具有相通性隅肥,有些問題表征(錯誤信息)或許不同竿奏,但解決辦法是一樣的。這如同疾病一樣腥放,癥狀可能不同泛啸,但用同一種藥可以治好。在stackoverflow上秃症,自己幾乎翻遍所有有關(guān)grunt構(gòu)建的問題候址,在就要放棄的那刻,突然發(fā)現(xiàn)了這篇文章Killing Spawned Processes when Grunt Exits种柑,其中一個回復(fù)是這樣的:
如果不仔細(xì)看這個回答岗仑,你可能看不懂它在說什么。其實這位回答者在告訴大家聚请,這個問題的發(fā)生可能是grunt-shell沒有很好處理進程的退出事件荠雕。正因為沒有退出事件(回調(diào)函數(shù))沒有正確被處理,所以無法看到更加詳細(xì)的信息驶赏,可能就給一個很簡單的提示炸卑。雖然這個帖子的問題與自己遇見的不同,但現(xiàn)象具有一定的關(guān)聯(lián)性煤傍。
如果是未能正確處理進程的退出事件盖文,那么是什么原因?qū)е碌哪兀縇inux系統(tǒng)一般以其穩(wěn)定性著稱蚯姆,也就是說在大多數(shù)情況下五续,進程的退出事件可以被正確處理。在本地的開發(fā)環(huán)境蒋失,同樣一份代碼可以正確地被構(gòu)建返帕,所以代碼不會存在問題。那么只有一種解釋篙挽,系統(tǒng)環(huán)境的問題荆萤。
系統(tǒng)環(huán)境有什么問題呢?我們的服務(wù)器都是購買阿里的ECS,系統(tǒng)環(huán)境的配置及安全設(shè)置链韭,我基本沒有做過很大的修改偏竟,而且我們對阿里云平臺的穩(wěn)健性還是十分信任。會不會是服務(wù)本身的性能存在問題敞峭?自己腦海里突然蹦出這個想法踊谋。自己利用<code>free -l</code>查看了服務(wù)器的內(nèi)存使用情況,不看不知道旋讹,一看嚇一跳殖蚕,服務(wù)的可用內(nèi)存不到100MB。如果跑grunt的構(gòu)建沉迹,那么是不是因為內(nèi)存不夠而出現(xiàn)未能正常退出睦疫,就直接被系統(tǒng)給kill。
為了驗證這個有點瘋狂的想法鞭呕,自己停掉了正在運行的tomcat及spring root服務(wù)蛤育,然后進行構(gòu)建,居然神奇地成功了葫松!太不可能思議了瓦糕,原來是內(nèi)存搞的鬼。那么一切的解釋就合情合理了:當(dāng)執(zhí)行<code>grunt build</code>時腋么,grunt嘗試運行某個任務(wù)但因內(nèi)存過低咕娄,無法做swap,進程退出事件也無法被正常激發(fā)党晋,僅給出了一個簡潔的提示谭胚。
這坑確實令人有點摸不著頭腦,沒有相關(guān)問題信息的輔助未玻,沒有大膽假設(shè)小心求證的思考灾而,是無法很快解決,甚至無法解決這個問題扳剿。
不知你猜對問題的原因了嗎旁趟?歡迎留言說說你思考過程以及結(jié)果。
無戒寫作訓(xùn)練營三期第十七天庇绽。學(xué)號77锡搜。