本文將給大家詳細(xì)介紹Linux常用的指令、演示以及一些基礎(chǔ)知識(shí)的講解
在本文章實(shí)戰(zhàn)案例中,我們會(huì)學(xué)習(xí)怎樣寫一個(gè)自己常用的工具腳本,怎樣調(diào)試Shell,怎么寫一個(gè)常用Java項(xiàng)目的管理腳本,怎樣找到適合自己的工具庫(kù)。
本文選自電子工業(yè)出版社的《Linux從入門到精通》一書
本書:由淺入深,從系統(tǒng)安裝到文檔處理,再深入權(quán)限、磁盤、進(jìn)程、系統(tǒng)管理實(shí)戰(zhàn):凝聚作者十多年開(kāi)發(fā)運(yùn)維經(jīng)驗(yàn),系統(tǒng)地理解和使用Linux圖表:100 張圖片,80 個(gè)表格,詳細(xì)說(shuō)明工具使用方法,可以作為案頭工具書配套:手把手式教學(xué),每個(gè)章節(jié)都有配套PPT與視頻詳解,讓你從零開(kāi)始也能學(xué)會(huì)案例:10 個(gè)實(shí)戰(zhàn)案例作為章節(jié)小結(jié),更有相關(guān)源碼,讓你拿來(lái)就用
1,寫一個(gè)自己的日志命令:logmsg
1)一般打印日志時(shí)需要記錄時(shí)間戳,我們現(xiàn)在改寫腳本“004-while.sh”,示例如下:
…… ##→編寫LogMsg函數(shù),每次調(diào)用,重新打印時(shí)間戳 LogMsg?()?{ ??local_time=`date?+"%Y-%m-%d?%H:%M:%S"` ??echo?$local_time?$1 } …… ???if?[?$sshd_count?-lt?1?] ???then ???????LogMsg??'沒(méi)有找到ssh服務(wù),重啟該服務(wù)'??????????#調(diào)用LogMsg函數(shù) ???????systemctl?start?sshd ???else ???????LogMsg??'ssh服務(wù)正常運(yùn)行中...'?????????????????#調(diào)用LogMsg函數(shù) ????fi
重新執(zhí)行,示例如下:
[root@linuxido?/shell]#?sh?004-while.sh? 2021-06-07?0711?ssh服務(wù)正常運(yùn)行中... 2021-06-07?0716?ssh服務(wù)正常運(yùn)行中... ……
2)如果每個(gè)腳本中都要寫個(gè)LogMsg的方法,就會(huì)很麻煩,可不可以像使用其他命令一樣,直接調(diào)用呢?例如echo、cat我們先來(lái)新建logmsg腳本。示例如下:
[root@linuxido?/shell]#?vi?logmsg.sh?????##→編輯logmsg.sh腳本 …… LogMsg()?{ ??local_time=`date?+"%Y-%m-%d?%H:%M:%S"` ??echo?$local_time?$1??#此時(shí)的$1是指調(diào)用LogMsg時(shí)輸入的第一個(gè)參數(shù) } LogMsg?$1?????#調(diào)用LogMsg函數(shù),此時(shí)的$1是指調(diào)用腳本時(shí)輸入的第一個(gè)參數(shù)
3)雖然寫了logmsg腳本,但是沒(méi)法在文件目錄以外的地方使用。還記得前面章節(jié)所說(shuō)的,命令一般放在哪個(gè)目錄嗎?當(dāng)然是/bin目錄了。
##→創(chuàng)建logmsg命令的符號(hào)鏈接 [root@linuxido?/shell]#?ln?-s??/shell/logmsg.sh?/bin/logmsg?? [root@linuxido?/shell]#?logmsg?????????##→直接執(zhí)行l(wèi)ogmsg命令 -bash:?/usr/bin/logmsg:?權(quán)限不夠?????????##→執(zhí)行時(shí)發(fā)現(xiàn)雖然調(diào)用了/usr/bin,但權(quán)限不夠 [root@linuxido?/shell]#?chmod?555?/bin/logmsg??##→賦予555權(quán)限,所有用戶可讀可執(zhí)行 [root@linuxido?~]##→logmsg?linuxido.com???????##→直接執(zhí)行l(wèi)ogmsg命令,參數(shù)為yaomm 2021-06-07?2319?linuxido.com?????????????????##→執(zhí)行成功
(4)為什么/bin目錄下的命令可以在任何目錄下直接執(zhí)行呢?因?yàn)榄h(huán)境配置的原因,/bin目錄下的命令直接被賦予了全局調(diào)用的環(huán)境。
注意:除了echo,還可以使用print、printf打印文本。
2,寫一個(gè)常用的備份命令:backup
1)編輯backup腳本,先故意命名bachup.sh。
[root@yaomm?shell]#?vi?bachup.sh????????????????##→編寫備份腳本 #!/bin/bash???? # description:編寫備份常用腳本 # date:2020-06-26 # filename:bachup.sh # author:linuxido.com #?編輯backup函數(shù),將要備份的文件名添加上時(shí)間戳之后改名 function?backup()?{ ??newfile=$1.`date?+%Y-%m-%d.%H%M.bak`;?????????##→新文件名稱,加上時(shí)間戳 ??cp?-p?$1?$newfile;????????????????????????????????##→復(fù)制一份文件 ??echo?"Backed?up?$1?to?$newfile.";?????????????##→打印成功日志 } backup?$1??????????????????????????????????????????##→調(diào)用backup函數(shù)
2)創(chuàng)建/bin目錄下的腳本鏈接,將bachup.sh鏈接為/bin/backup。
[root@yaomm?shell]#?ln?-s?/shell/bachup.sh?/bin/backup????##→創(chuàng)建鏈接,注意全路徑 [root@yaomm?shell]#?ll?/bin/backu* ##→創(chuàng)建成功 lrwxrwxrwx?1?root?root?16?Jun?20?10:33?/bin/backup?->?/shell/bachup.sh? [root@yaomm?shell]#?chmod?555?/bin/backup.sh???????##→賦予所有用戶執(zhí)行權(quán)限 [root@yaomm?shell]#?touch?sss.txt??????????????????##→創(chuàng)建測(cè)試腳本 [root@yaomm?shell]#?backup?sss.txt????????????????????##→備份測(cè)試 Backed?up?sss.txt?to?sss.txt.2021-06-20.1034.bak.??##→備份成功 [root@yaomm?shell]#?ll -rw-r--r--?1?root?root???0?Jun?20?10:31?sss.txt????????????????????????????##→原文件 -rw-r--r--?1?root?root???0?Jun?20?10:31?sss.txt.2021-06-20.1034.bak?##→備份文件
3,寫一個(gè)Java項(xiàng)目的管理腳本:springboot-admin.sh
在做Java開(kāi)發(fā)、運(yùn)維、測(cè)試的工作中,和Spring Boot打交道的地方很多。怎么輕松管理一個(gè)Spring Boot的項(xiàng)目部署呢?借著這個(gè)來(lái)自GitHub的開(kāi)發(fā)者junbaor的優(yōu)秀實(shí)例,我們來(lái)看看一個(gè)Shell腳本是如何煉成的。
修改后的腳本詳見(jiàn)本書代碼網(wǎng)盤(詳見(jiàn)“前言”)。簡(jiǎn)略代碼如下:
operation=$1??????##→第一個(gè)參數(shù),start、stop、restart、status springboot=$2?????##→第二個(gè)參數(shù),Jar包名 ##→校驗(yàn)參數(shù)是否為空 showUsage()?{ ????##→校驗(yàn)第一個(gè)參數(shù)是否為空? ????if?[?"$operation"?==?""?];????????##→注意:中括號(hào)[]兩端至少要有一個(gè)空格 …… ????##→校驗(yàn)第二個(gè)參數(shù)是否為空 ????if?[?"$springboot"?==?""?]; …… ????count=`ls?$springboot?|?wc?-l`???#?校驗(yàn)jar包是否存在 …… } ##→啟動(dòng)springboot項(xiàng)目 function?start() { ????count=`ps?-ef?|grep?java|grep?$springboot|grep?-v?grep|wc?-l` ????if?[?$count?!=?0?];then ????????echo?"$springboot?is?running..." ????else ????????????????ls?$spring ????????##→啟動(dòng)springboot項(xiàng)目,反斜杠連接命令 ????????nohup?java?-server?-Xmx1g?-Xms1g?-Xss512k? ????????-jar?$springboot?>?/dev/null?2>&1?& ????????##→調(diào)換提示位置 ????????echo?"Start?$springboot?success..." ????fi } ##→關(guān)閉springboot項(xiàng)目 function?stop() { …… ????count=`ps?-ef?|grep?java|grep?$springboot|grep?-v?grep|wc?-l` ????##→先用kill?-15?發(fā)出停止信號(hào),等待springboot自行關(guān)閉 ????if?[?$count?!=?0?];then ????????echo?"Stop?Success!?優(yōu)雅關(guān)閉?$springboot??Process..." ????????kill?$boot_id ?????fii …… } ##→重啟springboot項(xiàng)目,關(guān)閉后停止兩秒重新啟動(dòng) function?restart() { ????stop ????##→睡眠兩秒調(diào)用start方法 ????sleep?2 ????start } ##→查看springboot項(xiàng)目的啟動(dòng)狀態(tài) function?status() { ????count=`ps?-ef?|grep?java|grep?$springboot|grep?-v?grep|wc?-l` ????jarStatus=`ps?-ef?|grep?java|grep?$springboot` …… } showUsage?##→先驗(yàn)證參數(shù)是否為空 ##→只有第一個(gè)輸入變量是?start|stop|restart|status的時(shí)候,才執(zhí)行對(duì)應(yīng)的方法 case?$1?in ????????start) ????????start;; ????????stop) ????????stop;; ????????restart) ????????restart;; ????????status) ????????status;; ????????*) ?echo?-e?"33[0;34m ?請(qǐng)正確操作:{start|stop|restart|status}. Example:bash springboot-admin.sh start test-springboot.jar 33[0m" esac 執(zhí)行腳本: [root@yaomm?shell]#?sh?springboot-admin.sh?start?xx.jar??##→執(zhí)行一個(gè)不存在的jar包 ls:?cannot?access?xx.jar:?No?such?file?or?directory????????##→v0.3應(yīng)該解決這個(gè)問(wèn)題 ?xx.jar不存在 [root@yaomm?shell]#?sh?springboot-admin.sh?reload?/home/deploy/face-0.0.1-SNAPSHOT.jar? ??請(qǐng)正確操作:{start|stop|restart|status}. ???????????????????##→reload不存在已有選項(xiàng)中 ?Example:bash springboot-admin.sh start test-springboot.jar [root@yaomm?shell]#?sh?springboot-admin.sh?start?/home/deploy/face-0.0.1-SNAPSHOT.jar? ……???? Start?/home/deploy/face-0.0.1-SNAPSHOT.jar?success...?????##→正常啟動(dòng) [root@yaomm?shell]#?sh?springboot-admin.sh?stop?/home/deploy/face-0.0.1-SNAPSHOT.jar? Stop?/home/deploy/face-0.0.1-SNAPSHOT.jar?...???????????????##→正常關(guān)閉 Stop?Success!?優(yōu)雅關(guān)閉?/home/deploy/face-0.0.1-SNAPSHOT.jar??Process... 我們可以通過(guò)將腳本放入/usr/bin下或建立systemd服務(wù)的方式進(jìn)行服務(wù)控制,這個(gè)可以做到如下效果: systemctl?start?xxx.jar??????????????????????????????????????????##→方法1 springboot-admin?start?xxx.jar?????????????????????????????????##→方法2
小結(jié)
在學(xué)習(xí)完本章內(nèi)容后,我們已經(jīng)掌握了Shell的基本環(huán)境配置與常用的內(nèi)置變量,基本的語(yǔ)法操作與簡(jiǎn)單的腳本編寫,知道了怎樣寫一個(gè)自己的Shell命令,怎樣使用Shell命令實(shí)現(xiàn)一個(gè)服務(wù)的管理。
編輯:黃飛
?
評(píng)論