主要是介紹兩個部分,
shell編程的話它主要是有這樣三個特點, 第一個就是簡單高效, 第二個是功能強大, 第三個是可移植好。
因為他把我們的Linux的命令都放到shell編程里面,然后再通過加上循環加上判斷,然后實現這樣一個腳本, 這樣子的話我們就能夠去實現各種各樣想要的一些功能。
作為運維人員的話,我們編寫需要腳本是我們實現自動化的一個開始, 首先shell編程的話會有一個誤區,
我們最開始早期接觸shell編程的話,??我們覺得我們會把那些Linux命令直接就放到腳本里面,??它這樣的話我們最開始的就會認為shell編程 其實就是跟 Linux 命令堆在一起,??但是我們從shell編程的一個簡單的角度上考慮的話,它其實是Linux命令,還有再加上一些編程語法,?? 比如說我們給 Linux 命令加上一個什么 if 判斷,??如果說命令執行成功,我們才去執行下一個,或者說我們才輸出一個信息,??就是這樣的一個命令,再加上一些語法之后,就形成了這樣的一個shell腳本。??
下面這三個就是我們的經驗之談, 首先第一個就是運維的核心,就是在正確的節點上面去正確的去執行這些正確的Linux命令。??比如說我們要啟動某一臺節點上的某個服務,??對吧?我們要登錄到遠程登錄到這個節點上面,然后去執行把服務起來的一個動作,??或者說我們要執行把這個服務重新加載的一個動作,??然后運維工具的本質是什么?就是能夠遠程登錄到這臺節點上面去執行 Linux 命令,??這個是很多運維工具的一個基本功能。??
比如說我們后面用到的ansible和saltstack,它們都會有這樣的一個最基礎的功能,??這個也是我們作為使用者會經常使用的功能。??
然后運維開發是什么?就是說我們要把我們這些經常要登錄到某臺節點,??然后去做的某些采集數據的動作,或者說發郵件通知,如果說有節點異常,我們要報警,??我們會把這些動作,我們以前要手工操作的這些步驟,全部用寫成代碼,寫成腳本,??我們通過 Python運行一下腳本,或者說寫成shell或者說寫成放到定時任務里面去定時執行,??這樣的話我們就實現了自動化的開發。??
我們運維開發主要是將我們這些手動的操作去寫成代碼,然后放到代碼,然后有代碼去幫我們執行,??去實現操作的自動化,至少我們要能夠實現就節約我們這些運維人員的時間。??
好,關于shell編程中的一些重要概念,其實跟大部分的編程語言是一樣的,??所以我們要看到shell編程中也有變量的,
變量定義,還有字符串的一些操作,還有數組還有判斷計算,??計算的話就是簡單的加減乘除,然后還有浮點運算等等,還有在需要shell里面也會有函數的概念。??
此外的話shell的函數和我們其他高級語言的函數,比如說Python或者說C,C++這些函數它是不一樣的,??它的傳參是比較特別的,我們是通過位置參數去傳。??
接下來的話我們會在shell編程的實戰中看到這一點,然后參數的話它其實會分什么?函數的參數??和腳本的參數都統一稱之為位置參數。??
接著的話還有循環,我們最核心的就是要實現叫多進程的操作。??好,在shell中判斷條件,還有循環語句,這些都是最基本的判斷語句,最基本的就是if。
循環的話主要就是for while和until這三個語句。??
在shell中的多進程,實現主要是一個什么?
要實現這樣一個后臺執行服務,??我們一個操作或者說我們調用一個函數,我們在操作后面加上& 的符或者說與符的時候,??這個操作或者說這個函數它里面的任務就會放到后臺去,自動去起一個進程去執行,但是它會存在一個問題,??假設我有100個這樣的操作,我每一個操作都加上& ,??這樣的話后臺就會起100個進程分別去執行這些動作,這樣的話我們是沒有辦法去控制進程數的。??
如果說假設我們的任務有1萬個,??我們真的能夠在一臺節點上面去1萬個進程去執行這些操作嗎???這樣子的話效率其實是會急劇下降的,因為進程之間的一個開銷其實也是非常大的一個開銷,??它也會占用大量的時間,甚至會導致這個節點無法執行。
我們需要去控制每次啟動的進程數,??控制進程數的一個核心就是通過這個叫文件描述符和管道配合執行,??它是怎么樣執行,我這里就畫了這樣一個圖。??
我們首先看一下這個管道,管道的一個特點就是說我這邊管道里面假設有10個數據,??我如果說想從管道里面讀取一個數據的時候,這個時候管道里面是不是減少了一個??,假設我這個管道里面沒有數據,我讀的時候我這個操作想從管道里面去讀一個操作,??這個時候這個操作其實會阻塞在這里,它就不會返回,它就會一直阻塞到這里,直到什么時候返回,直到我從有另外一個操作像管道里面去寫入一個字符串的時候,??這邊阻塞的操作就能夠立馬收到這個字符串,然后它這個操作就會返回,??
這樣子我們怎么樣實現控制最大進程數,那就很簡單,比如說我們管道里面有三個字符,本身有三個字符串,??3個帶換行的字符串,我們寫入管道里面3個字符串之后,假設我們有10個任務,這個時候我們作為第一個任務的話,在執行這個任務之前,我要向管道里面去讀取一個字符串,??讀了一個字符串之后,接著我就把這個任務放到后臺去執行,就加上與這個符號&,那是不是第一個就正確執行了???
然后讀取了第一個任務之后,這個時候管道里面是不是只有兩個字符,?? 接著再來,第二個任務的時候是不是要又向管道里面再取一個字符,第三個取,??然后等到第四個的時候,這個管道里面是不是已經沒有字符了???
這個時候這個系統里面其實已經相當于是啟動了三個進程,?? 但是第四個任務在執行的時候,它由于沒有辦法返回,??因為它讀這個管道里面的字符串它讀不到,??然后它這個任務就會阻塞在這里,后面要放到后臺去執行的任務就沒有辦法執行,??所以它就會一直阻塞在上面讀的操作里面。??一旦我們這個時候我們的系統里面是有三個進程去執行任務,??我們在這個任務的最后,也就是說任務執行完了,??但是它的最后需要做一個什么操作,它需要向管道去寫入這樣一個字符串。
也就是說你的任務執行成功了,??我最后的話要向管道里面去寫,??相當于是把我原來消耗掉的一個任務,把消耗掉的一個字符串再把它寫回到管道里面。??這個時候當我這個任務執行結束之后,管道這個時候又多了一個字符串,??原來阻塞在這里的任務是不是突然之間就是有字符串進來了,我就立馬去讀取這個字符串,??接著又會有一個新的任務,就會啟動一個新的進程去執行一個任務。??
想象一下??,是不是一個管道里面反正有三個字符串對吧?我們依次去讀,這三個字符串讀完了之后,第四個任務進來的時候就會阻塞在這里,??然后等到每一個任務去執行完了之后,他就會把這個字符串重新再寫回到這管道里面,??這樣子就能夠保證這個系統里面最多只有三個進程在執行。??第四個進程的時候是因為它??管道里面是沒有字符串的,所以說它永遠會阻塞在這里。直到一個任務結束之后,管道里面有了字符串,第四個任務才能去執行。??
這個時候系統里面還是只有三個,因為上一個已經結束了對不對,??這樣的一個原理,就是shell編程里面控制最大進程數的原理,就是通過這樣一個管道實現的,??后面我們也會通過這個原理來去自己手動編寫控制多進程的一個shell腳本。??
最后的話我們還會展示兩個案例,幫助大家去理解shell編程,??它在生產上是怎么用的。
最后的話我們還會給大家演示一下關于磁盤和邏輯卷的管理。??
這是為了我們后面在做一些Python代碼的時候,我們要做一些操作,我們要建一個邏輯卷,建一個卷了之后,比如說我們??有一個的 1 g的目錄, 我們想給它建1 g 的空間,有一個1 g的空間之后,然后我想把磁盤把它寫滿,??就是說為了方便我們后續去做一些操作,然后做這些操作的時候,我們要能夠理解磁盤,??一個20g的磁盤是怎么樣把20g的磁盤能夠切成一個1 g的小磁盤,然后一個小邏輯卷,??然后把小邏輯卷然后拿來使用,這是Linux運維里面的一些基礎知識。??
最后的話我們會來搭建一下兩個Linux的一個基礎服務,??
在搭建這個服務過程中我們通過的比如說我們這個FTP服務我們會自己動手去實現一個shell腳本,??那就是實現一鍵部署 FTP服務的一個腳本。
審核編輯:劉清
-
Linux系統
+關注
關注
4文章
593瀏覽量
27392 -
FTP
+關注
關注
0文章
110瀏覽量
40625 -
shell編程
+關注
關注
0文章
10瀏覽量
5878
發布評論請先 登錄
相關推薦
評論