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