為什麼程式猿都應該學點linux命令?

xindoo發表於2021-12-09

大家好,我是xindoo,今天和大家分享下一個我的觀點——程式猿都應該學點Linux命令!這也是這兩年我做後端開發的切身體會。認識我的人可能都知道,我職業生涯比較“特殊”,我畢業後先是乾的運維,然後再轉的Java開發。 運維的經歷苦不堪言,但積累下來的運維相關經驗卻讓我在轉開發後受益匪淺,其中一項就是熟悉大部分常用的Linux命令。 我已經記不清多少次只用幾行命令搞定別人半天都沒搞定的事兒,然後拂袖離去,深藏功與名……

學好linux命令有啥用?

用linux命令日常提效的例子數不勝數,我說一些對我的明顯作用。

快速排查和定位問題

舉個很簡單的場景,早上去上班,剛坐下突然收到伺服器的報警,CPU使用率98%!登陸伺服器top命令可以快速定位到是哪個程式或者執行緒,sar命令定位出問題發生時間點,用cat、grep等命令快速找到出問題時的日誌……,分分鐘解決問題。當高手泡杯茶的功夫解決問題時,新手還不知所措。

關於效能問題定位的命令,我之前翻譯過篇文章10行命令60秒快速定位效能瓶頸有興趣可以瞭解下。

資料清洗和統計

資料清洗和統計的方法很多,就比如用excel就可以完成很多型別的統計工作,但針對一些簡單的統計,我自己寫個shell指令碼也能分分鐘搞定,尤其是當需要被統計的資料是直接在伺服器上時。比如這臺機器上服務今天員工報過多少次error。還有從日誌中解析出某個介面今天所有請求的平均、最大、最小耗時…… 像這種簡單的資料清洗和統計,我用grep、awk也能分分鐘完成。

印象比較深的一個經歷,有次我們在排查某個問題時,從兩個系統中匯出了兩份使用者資料,想對比下每個使用者在兩個系統裡的資料差異,當時資料量還是挺多的。這種問題你會怎麼辦? 從伺服器上拉到本地,然後用excel的vlookup好像也行。當伺服器上資料不允許下載呢?

這兩份資料如果是資料庫裡的兩個表,很明顯就是將兩個表直接join起來(當時也有同事提出先將資料入庫)。但在linux上用awk命令可以很容易實現這個功能,後來我也把具體方法寫了一篇部落格awk實現類sql的join操作

輔助開發

輔助開發的事就數不勝數了,比如我用wget命令下載檔案,用curl命令除錯介面,用dig、ping、nc測試網路,用wrk壓測介面……

裝X

這個就不多說了,在控制檯各種敲,很geek。

如何學習Linux命令

以上說了好多學好linux命令的優點,我相信你肯定按捺不住想要學了,這裡我分享一些我的學習方法。

多練習,但沒必要太刻意練習

這個也算是老生常談了,如何東西想要熟練,都需要大量的刻意練習,學習linux命令也不例外。 但我這裡給一個忠告,就是沒必要一次性花太多的時間去熟練掌握某個linux命令,尤其是有些比較冷門的命令。 很多命令確實很不常用,如果你執著於一次性掌握其所有引數,但長期不使用肯定還是會忘記,到時候還是得重新學,投入產出比太低。

比如我之前學習過tcpdump的使用,當時大部分的引數基本都會用了,但tcpdump在日常工作中使用的太少了,而且也涉及到大量網路的知識,我已經很長時間沒有用過了, 已經忘記怎麼使用了。 像這種工作中不太涉及,也不常用的命令,瞭解下就可以了,知道它能幹什麼足以,等真正有需求的時候再去學。

先知道有什麼樣的命令,再考慮怎麼去用

Linux命令及其引數不能用浩如煙海來描述,但也算是數不勝數了,索性大部分的命令及引數是不會用到的,但也推薦大家稍微記錄下。 就比如我今天早上遇到一凌晨OOM的問題,我想去追溯那段時間機器的負載情況,最簡單的方式就是用sar命令,方便快捷,雖然我早已忘記具體的引數,但man或者搜尋下立馬就知道了。

所以我的建議是先知道有什麼樣的命令,然後再按需求去了解具體命令的使用方式。初學者應該從最簡單最常用的命令開始學起,比如下圖中的命令。
在這裡插入圖片描述
網上有很多常用命令的參考指南,我之前也寫過一篇部落格我常用的Linux命令

善用man和搜尋引擎

在linux中,所有命令的使用方式都可以通過man命令來查詢,包括詳細的示意,各種引數的作用都有,都是命令的開發者提供了,肯定保證準確無誤,不過缺點是都是英文的,而且有些篇幅較長,對像我這種英文不太好的人不是很友好。

另外,搜尋引擎也是瞭解一個linux如何使用的好工具,網上有各種相關部落格,有些入門網站(比如菜鳥教程)也有比較體系化的教學內容,甚至有時候還可以找到你問題的解決方案。這種方式對新手比較友好,但這種方式的缺點是內容質量參差不齊,自己要做好資訊的辨別和篩選。

對於我不熟悉的linux命令,我日常是兩種方法都使用,比較傾向於第二種,但在第二種無法解決我問題時我會去看man收藏,去尋找更專業的資料。

收藏程式碼片段

我可能比較偏實用主義,學linux命令大多數情況都是為了解決具體的問題,而我遇到的問題各式各樣,使用的方法也不一樣,可能時隔好久才會重複出現,等出現時之前用的解決方案早就忘記了。為避免這種問題,我開始用snippetsLab記錄一些常用的程式碼片段,將自己寫的稍微複雜且不是很常用的程式碼片段儲存起來,加上描述和標籤方便檢索,等之後如果再用到可以快速找回。

比如像上文中awk實現join的功能,稍微有點複雜,每次讓我重新寫也不是寫不出來,但還是需要花點時間除錯的。 這種與其每次都調,還不如記錄下來下次貼過來直接使用。 這兩年我已經在snippetsLab中記錄了數百條程式碼片段了。
在這裡插入圖片描述

結語

說真的,雖然我不推薦做運維這個工作,尤其是在國內,但我非常建議大家瞭解下運維相關的技能,尤其是各種常用的linux命令,不管你是前端還是後端、不過是java還是go程式猿,都應該瞭解常用的linux命令。

相關文章