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