Shell在日常工作中的應用實踐

京東雲開發者發表於2023-04-20

作者:京東物流 李光新

1 Shell可以幫我們做什麼

作為一名測試開發工程師,在與linux伺服器互動過程中,大都遇到過以下這些問題:

•一次申請多臺伺服器,多臺伺服器需要安裝相同軟體,配置相同的環境,同樣的操作需要重複多次;

•工作中經常會使用命令列命令來完成我們的一些操作,但是有些命令使用率很高,而且很長,每次都全部敲進去勢必會浪費很多時間(比如查日誌)

長此以往,以上兩個問題可能會導致:重複性工作,個人能力得不到任何提高,浪費時間,而且還容易出錯,作為一名技術人員,當同一個操作重複了三次,我們就應該考慮是否可以透過工具來幫我們實現。

而shell指令碼正好擅長,把複雜問題分解成簡單的小問題,然後再把各個部分功能組合起來解決複雜問題。 當然,有些命令我們只能節省三五秒的時間,短期看不到時間的節省,但是從長期來看這個價值將是巨大的。我們可以將這些時間專注於更有意義,更重要的事情 - 提高生命質量。

2 功能介紹

Shell指令碼語言的優勢在於處理偏作業系統底層的業務,例如,Linux系統內部很多應用是用shell指令碼語言開發的,因為有眾多的Linux系統命令為它作支撐,特別是Linux正規表示式和三劍客grep、awk、sed等命令。

對於一些常見的系統指令碼,使用shell開發會更簡單、更快速。就像讓軟體一鍵自動化安裝、最佳化,監控報警指令碼,軟體啟動指令碼,日誌分析指令碼等,雖然PHP和Python語言也能做到這些,但是由於掌握難度、開發效率和開發習慣等,可能就不如shell指令碼語言流行及有優勢了。

shell是一個C語言編寫的指令碼語言,它是使用者與linux的橋樑,使用者輸入命令交給shell來處理,shell將相應的操作傳遞給核心,核心把處理的結果輸出給使用者。

可參考如下流程示意圖:

簡單來說:shell就是一個使用者跟作業系統之間互動的命令直譯器

3 基本用法

下面首先來介紹下日常使用較多的基本指令:

3.1 檔案複製

3.2 檔案合併

有時候,要遇到將多個檔案合併成一個的需求,除了重複的複製和貼上,還可以透過簡單指令來輔助實現。

cat命令

預設地,cat命令可以直接接收多個引數,這樣,透過重定向可以很方便地合併檔案:

效果如下:

4 案例分享

4.1 自動新增註釋

下面我們從日常工作入手,和大家一起來看下,shell有哪些提高工作效率的應用場景~

首先,我們編寫的指令碼有時候並不僅僅是我們個人使用,可能是團隊內部使用,所以通常在指令碼正式編寫前,通常需要新增部分註釋,註明指令碼的作用,建立日期,建立人等資訊;

而如果編寫指令碼比較多的話,這些重複性工作就會成為我們的負擔,所以,我們又可以將這些交給shell來幫我們實現,用shell指令碼來解決建立shell指令碼的重複性工作

下面給大家分享一個shell指令碼的模板檔案,把它複製到使用者的根目錄下並命名成 .vimrc 名稱,這樣我們以後再次開啟以 .sh結尾的檔案時就會成自動生成一些註釋資訊,只要稍稍修改一下即可如圖所示:

vimrc檔案是vim的環境設定檔案,在啟動vim時,當前使用者根目錄下的.vimrc檔案會被自動讀取,該檔案可以包含一些設定甚至指令碼,所以,一般會在.vimrc檔案中根據個人喜好進行一些自定義設定;

下面指令碼我都註釋了具體含義,可參考:

實現效果展示:

4.2 記憶體使用率監控預警

日常工作中,經常會遇到由於伺服器被日誌打滿而不得不重啟的場景,而對於一些必要的單據,就需要時常注意日誌的備份,所以可以編寫如下一個指令碼,來做提醒;

如下指令碼實現了,當伺服器記憶體使用率超過90%時,提示儲存日誌操作,如果未超過90%,則不作任何處理;

實現效果展示:

4.3 後臺服務啟動/停止/重啟指令碼

對於一些小範圍使用,暫未接入j-one部署的伺服器,每次後臺服務程式碼更新,程式碼部署都是一項比較繁瑣的工作,而這就到了shell發揮威力的時候了。

實現原理就是,將停止服務和啟動服務需要執行的命令寫進指令碼,透過shell互動來實現,外加一些必要的判斷邏輯,比如:

1.執行啟動服務時判斷服務是否正在啟動中;

2.執行停止服務時判斷根據互動條件篩選出的服務是否只有一個;

3.執行重啟服務時判斷服務是否正在啟動中;

4.保證中間所有互動過程中的唯一性,避免失誤將其他人的服務停止

實現指令碼如下:

實現效果展示:

該指令碼可在團隊內部通用,只需要輸入任務型別編號和對應任務關鍵字兩步即可,指令碼在執行過程中會自動提示你確認執行任務物件是否正確,以免誤傷;

1)停止服務

2)啟動服務:

3)重啟服務

大大減少了團隊服務部署的工作量~

4.4 函式化封裝

對於一些比較複雜的功能,或者需要多次執行的功能,shell也支援將功能封裝為函式,直接執行函式即可;

比如伺服器的部署基本可以分為以下幾個步驟:

•服務部署目錄建立

•服務配置部署

•服務應用部署

•服務應用啟動

則該四個步驟可以透過shell指令碼封裝為四個函式,如下:

將每個模組編寫為函式,最後,只需要呼叫main函式,即可執行上述一系列操作;

以此類推,安裝nginx,Java,jenkins等各種軟體操作,也可以封裝成多個函式,實現自動化一鍵完成~

5 結語

綜上,linux伺服器上,所有的重複性工作都可以交給shell來打理,日常工作中增加一個萬能助手,何樂而不為呢

shell指令碼小巧且功能強大,以上只是給大家分享了些日常使用到的指令碼,其他功能大家也可以舉一反三,透過各種流程控制組合來實現,讓shell來幫我們做工具人,我們就可以騰出更多的時間來做更重要且更有意義的事情了,與君共勉。

相關文章