作者:京東物流 李光新
作為一名測試開發工程師,在與linux伺服器互動過程中,大都遇到過以下這些問題:
•一次申請多臺伺服器,多臺伺服器需要安裝相同軟體,設定相同的環境,同樣的操作需要重複多次;
•工作中經常會使用命令列命令來完成我們的一些操作,但是有些命令使用率很高,而且很長,每次都全部敲進去勢必會浪費很多時間(比如查紀錄檔)
長此以往,以上兩個問題可能會導致:重複性工作,個人能力得不到任何提高,浪費時間,而且還容易出錯,作為一名技術人員,當同一個操作重複了三次,我們就應該考慮是否可以通過工具來幫我們實現。
而shell指令碼正好擅長,把複雜問題分解成簡單的小問題,然後再把各個部分功能組合起來解決複雜問題。 當然,有些命令我們只能節省三五秒的時間,短期看不到時間的節省,但是從長期來看這個價值將是巨大的。我們可以將這些時間專注於更有意義,更重要的事情 - 提高生命質量。
Shell指令碼語言的優勢在於處理偏作業系統底層的業務,例如,Linux系統內部很多應用是用shell指令碼語言開發的,因為有眾多的Linux系統命令為它作支撐,特別是Linux正規表示式和三劍客grep、awk、sed等命令。
對於一些常見的系統指令碼,使用shell開發會更簡單、更快速。就像讓軟體一鍵自動化安裝、優化,監控報警指令碼,軟體啟動指令碼,紀錄檔分析指令碼等,雖然PHP和Python語言也能做到這些,但是由於掌握難度、開發效率和開發習慣等,可能就不如shell指令碼語言流行及有優勢了。
shell是一個C語言編寫的指令碼語言,它是使用者與linux的橋樑,使用者輸入命令交給shell來處理,shell將相應的操作傳遞給核心,核心把處理的結果輸出給使用者。
可參考如下流程示意圖:
簡單來說:shell就是一個使用者跟作業系統之間互動的命令直譯器
下面首先來介紹下日常使用較多的基本指令:
有時候,要遇到將多個檔案合併成一個的需求,除了重複的複製和貼上,還可以通過簡單指令來輔助實現。
cat命令
預設地,cat命令可以直接接收多個引數,這樣,通過重定向可以很方便地合併檔案:
效果如下:
下面我們從日常工作入手,和大家一起來看下,shell有哪些提高工作效率的應用場景~
首先,我們編寫的指令碼有時候並不僅僅是我們個人使用,可能是團隊內部使用,所以通常在指令碼正式編寫前,通常需要新增部分註釋,註明指令碼的作用,建立日期,建立人等資訊;
而如果編寫指令碼比較多的話,這些重複性工作就會成為我們的負擔,所以,我們又可以將這些交給shell來幫我們實現,用shell指令碼來解決建立shell指令碼的重複性工作;
下面給大家分享一個shell指令碼的模板檔案,把它拷貝到使用者的根目錄下並命名成 .vimrc 名稱,這樣我們以後再次開啟以 .sh結尾的檔案時就會成自動生成一些註釋資訊,只要稍稍修改一下即可如圖所示:
vimrc檔案是vim的環境設定檔案,在啟動vim時,當前使用者根目錄下的.vimrc檔案會被自動讀取,該檔案可以包含一些設定甚至指令碼,所以,一般會在.vimrc檔案中根據個人喜好進行一些自定義設定;
下面指令碼我都註釋了具體含義,可參考:
實現效果展示:
日常工作中,經常會遇到由於伺服器被紀錄檔打滿而不得不重啟的場景,而對於一些必要的單據,就需要時常注意紀錄檔的備份,所以可以編寫如下一個指令碼,來做提醒;
如下指令碼實現了,當伺服器記憶體使用率超過90%時,提示儲存紀錄檔操作,如果未超過90%,則不作任何處理;
實現效果展示:
對於一些小範圍使用,暫未接入j-one部署的伺服器,每次後臺服務程式碼更新,程式碼部署都是一項比較繁瑣的工作,而這就到了shell發揮威力的時候了。
實現原理就是,將停止服務和啟動服務需要執行的命令寫進指令碼,通過shell互動來實現,外加一些必要的判斷邏輯,比如:
1.執行啟動服務時判斷服務是否正在啟動中;
2.執行停止服務時判斷根據互動條件篩選出的服務是否只有一個;
3.執行重啟服務時判斷服務是否正在啟動中;
4.保證中間所有互動過程中的唯一性,避免失誤將其他人的服務停止
實現指令碼如下:
實現效果展示:
該指令碼可在團隊內部通用,只需要輸入任務型別編號和對應任務關鍵字兩步即可,指令碼在執行過程中會自動提示你確認執行任務物件是否正確,以免誤傷;
1)停止服務
2)啟動服務:
3)重啟服務
大大減少了團隊服務部署的工作量~
對於一些比較複雜的功能,或者需要多次執行的功能,shell也支援將功能封裝為函數,直接執行函數即可;
比如伺服器的部署基本可以分為以下幾個步驟:
•服務部署目錄建立
•服務設定部署
•服務應用部署
•服務應用啟動
則該四個步驟可以通過shell指令碼封裝為四個函數,如下:
將每個模組編寫為函數,最後,只需要呼叫main函數,即可執行上述一系列操作;
以此類推,安裝nginx,Java,jenkins等各種軟體操作,也可以封裝成多個函數,實現自動化一鍵完成~
綜上,linux伺服器上,所有的重複性工作都可以交給shell來打理,日常工作中增加一個萬能助手,何樂而不為呢
shell指令碼小巧且功能強大,以上只是給大家分享了些日常使用到的指令碼,其他功能大家也可以舉一反三,通過各種流程控制組合來實現,讓shell來幫我們做工具人,我們就可以騰出更多的時間來做更重要且更有意義的事情了,與君共勉。