當前位置:首頁 » 網頁前端 » shell編寫運維腳本
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

shell編寫運維腳本

發布時間: 2022-12-06 05:28:19

1. 什麼是shell腳本

操作系統與外部最主要的介面就叫做shell。shell是操作系統最外面的一層。shell管理你與操作系統之間的交互:等待你輸入,向操作系統解
釋你的輸入,並且處理各種各樣的操作系統的輸出結果。 shell提供了你與操作系統之間通訊的方式。這種通訊可以以交互方式(從鍵盤輸
入,並且可以立即得到響應),或者以shell script(非交互)方式執行。shell script是放在文件中的一串shell和操作系統命令,它們可以被
重復使用。本質上,shell script是命令行命令簡單的組合到一個文件裡面。 Shell基本上是一個命令解釋器,類似於DOS下的command.com
。它接收用戶命令(如ls等),然後調用相應的應用程序。較為通用的shell有標準的Bourne shell (sh)和C shell (csh)。

互動式shell和非互動式shell 互動式模式就是shell等待你的輸入,並且執行你提交的命令。這種模式被稱作互動式是因為shell與用戶進行交
互。這種模式也是大多數用戶非常熟悉的:登錄、執行一些命令、簽退。當你簽退後,shell也終止了。 shell也可以運行在另外一種模式:非
互動式模式。在這種模式下,shell不與你進行交互,而是讀取存放在文件中的命令,並且執行它們。當它讀到文件的結尾,shell也就終止了。

shell的類型在UNIX中主要有兩大類shell Bourne shell (包括 sh, ksh, and bash) Bourne shell ( sh) Korn shell ( ksh) Bourne Again
shell ( bash) POSIX shell ( sh) C shell (包括 csh and tcsh) C shell ( csh) TENEX/TOPS C shell ( tcsh).
附:LINUX系統的shell原理

Linux系統的shell作為操作系統的外殼,為用戶提供使用操作系統的介面。它是命令語言、命令解釋程序及程序設計語言的統稱。

shell是用戶和Linux內核之間的介面程序,如果把Linux內核想像成一個球體的中心,shell就是圍繞內核的外層。當從shell或其他程序向
Linux傳遞命令時,內核會做出相應的反應。 shell是一個命令語言解釋器,它擁有自己內建的shell命令集,shell也能被系統中其他應用
程序所調用。用戶在提示符下輸入的命令都由shell先解釋然後傳給Linux核心。

2. linux運維一般需要用shell寫什麼腳本

互動式(Interactive):解釋執行用戶的命令,用戶輸入一條命令,Shell就解釋執行一條。 批處理(Batch):用戶事先寫一個Shell腳本(Script),其中有很多條命令,讓Shell一次把這些命令執行完,而不必一條一條地敲命令。 /etc:這個目錄包含所有系統層面的配置文件。它也包含一系列的shell腳本,在系統啟動時,這些腳本會運行每個系統服務。 你可以去我的博客()上面看一下,我列出了部分Linux目錄的詳解

3. Linux運維工程師的職責

Linux運維工程師的職責1

職責:

1、 負責服務台排班,管理服務台日常運營,業務及時上傳下達。

2、 保證服務台服務提供效率,及時發現問題、解決問題。

3、 負責服務糾紛及突發事件的處理工作。

4、 負責對組內員工進行監督和評審。

5、 負責對組內員工進行培訓工作。

6、 對服務台運營機制不斷優化和改進。

任職要求:

1、大專及以上學歷,計算機專業優先。

2、3年以上工作經驗,在IT行業1年以上同崗位工作經驗,帶過團隊。

3、強有力的組織協調能力,有有效調動團隊積極性的能力和方法,。

4、責任心強,有良好團隊協作和服務意識,有良好的溝通表達能力、隨機應變能力。

Linux運維工程師的職責2

職責:

1.負責伺服器的搭建、部署、監控、調優、升級、日常維護和管理工作;

2.負責處理系統方面日常變更、控制突發情況,對疑難問題進行分析並解決;

3.支持伺服器系統部署、應用調整和優化,提高操作效率,增強系統可用性;

4.雲台與產品發布迭代,升級部署。

【任職要求】

1.了解各種計算機軟硬體,可獨立進行安裝、調試及故障排除;

2.了解區域網的維護及網路安全知識,可熟練進行區域網的搭建和網路設備的基本維護和故障處理;

3.知道運用LINUX伺服器進行維護與管理;

4.了解nginx,tomcat等相關服務部署;

5.了解Mysql資料庫管理、監控和備份優先;

6.了解常見雲如阿里雲使用。

Linux運維工程師的職責3

職責:

1、 對線上網站系統進行版本更新、應用部署、數據遷移,問題分析和跟進,及時處理突發故障;

2、 網站日常維護工作,包含定期的伺服器、系統、應用、資料庫巡檢等工作;

3、 支撐公司部門業務數據統計和提取;

4、 分析系統存在隱患,並能提出合理的調整優化方案;

5、 制定和改進應急預案、策略和流程,提高系統服務的運行穩定性、質量及效率;

任職要求:

1、 全日制大專或以上學歷,計算機及相關專業畢業,3年及以上專職大型系統維護經驗;

2、 熟練使用Linux操作系統常用運維命令,能熟練編寫shell或python腳本,可獨立編寫維護自動化及監控腳本;

3、 具有一定網路鏈路分析能力,可排查簡單的網路問題;

4、 熟練使用Nginx、Tomcat、Redis、RabbitMQ等開源應用軟體,並能快速進行部署,具有豐富的調優經驗;

5、 熟悉常用的SQL語句;

6、 對Mysql資料庫具有豐富的維護經驗,熟悉mysql主從、集群配置,並能提出優化建議;

7、 5年以上網站/軟體維護經驗,有大型網站的web架構部署和實踐經驗優先。

Linux運維工程師的職責4

職責:

1、負責項目在客戶現場的系統搭建、初始化設定和系統升級、功能測試、用戶驗收

2、負責項目運維階段應用回訪、跟進、改善和報告編寫,定期分析客戶數據並溝通記錄新需求;

3、根據要求參與項目各個階段的工作例會並完成相關報告

4、編制參與項目各個階段的項目文件:如工作記錄等;

5、與項目相關方日常溝通協調,保證項目順利執行;

6、負責客戶使用培訓及客戶使用問題答疑。

崗位要求

1、計算機相關專業,具備2年以上項目實施工作經驗;

2、能夠適應不定期的出差工作;

3、具備較強的溝通和協調能力,問題發現和解決的能力;

4、具備高度的自我激勵能力、團隊管理能力、有責任心、使命感以及誠信度;

5、熟練應用sql語句,熟悉sqlserver/mysql/oracle任何一種資料庫,熟悉office 有良好的文檔編寫能力;

6、熟悉tomcat,熟練使用Linux等主流伺服器操作系統。

Linux運維工程師的職責5

職責:

負責銀行各產品的平台搭建,部署,遷移,以及常規的產品升級;

負責後台系統的優化,資料庫的調優;

負責編寫腳本實現自動化運維;

負責監控系統相關性能和運行情況;

負責快速定位系統故障,並第一時間解決或協調相關人員解決;

負責產品維護手冊以及相關文檔的編寫;

任職資格:

2年左右相關工作經驗;

熟練掌握,Linux,AIX,windows的基本命令,對常見的系統性能問題有初步的認識;

熟練使用SQL語言,並了解資料庫(ORACLE,MYSQL等)的運行機制,並有資料庫操作經驗;

熟練並能使用shell,python,Perl等其中一種腳本語言,並能編寫相關腳本;

熟悉中間件的使用,(MQ,WAS等),熟悉負載均衡,有高並發的負載調優的經驗;

需要一定的溝通的能力;

Linux運維工程師的.職責6

職責:

1、 負責維護簡訊管理平台的系統部署、日誌監控、應急響應、平台升級以及日常的維護等。

2、 負責linux伺服器的日常維護及文件備份,保護文件安全和許可權分配,維護系統的正常運作,Linux應用程序的配置,管理。

3、 負責對接落地資源、接入資源。配置客戶數據,為客戶提供技術支持。優化落地線路、資源調度,使客戶質量指標達到。

4、 檢測簡訊通道的運行情況,遠程重啟簡訊平台伺服器,激活簡訊通道。

5、 用mysql進行各種業務的數據統計分析。

任職資格:

1、 計算機或相關專業大專以上學歷,1年以上系統運維或相關工作經驗。

2、 熟練使用VOS系統、linux、mysql、shell等腳本命令。

3、 對公有雲產品(阿里雲)有一定的經驗和了解。

4、 豐富的IT平台監控、系統運維經驗。

5、 熟悉Mysql、oracle資料庫以及redis編程者優先。

6、 熟悉Java/Shell/PHP/Python等一種語言者優先。

7、 有團隊精神,具有鑽研精神、具有較強的自主學習性。

8、 溝通能力強,有強烈的客戶服務意識。

9、 具有較強的責任心,能夠在一定壓力下工作,積極主動、認真踏實、獨立解決問題的能力。

Linux運維工程師的職責7

1. 負責持續集成/自動化運維平台搭建。

2. 產品上線部署與發布。

3. 對系統、WEB、資料庫日誌收集分析,發現潛在隱患。

4. 伺服器日常監控及報警處理。

5. 突發情況應急預案、應急處理。

6. 阿里雲相關產品應用。

7. Docker鏡像製作,K8S環境搭建。

8. Nginx、MQ等中間件的搭建、配置、管理、優化和維護。

9. Centos、GitLab、MYSQL的安裝、配置、管理和維護。

10. mysql安裝、配置、排錯、備份還原、性能優化及監控。

11. 其他監控軟體搭建及應用。

Linux運維工程師的職責8

職責:

1、負責系統基礎運維工作、雲平台IT組件的日常維護。

2、與相關團隊展開合作,確保系統的日常運行正常。

3、負責突發事件管理與跟蹤,確保業務穩定運行等。

4、自我學習,主動提升技術水平。

任職要求:

1、本科以上學歷,計算機相關專業,一年以上IT運維經驗

2、精通Linux、Windows操作系統故障處理及使用

3、熟悉Shell/Python/Perl至少一種編程語言

4、熟悉網路基礎知識TCP/IP、HTTP等網路協議

5、熟悉RAID原理,對存儲設備有一定了解的優先

6、有較好的文字組織能力,能參與一定的文檔編寫的優先

Linux運維工程師的職責9

職責:

1、負責公司計算機、列印機等軟硬體設備的配置、維護與管理,保障日常工作正常運行。

2、負責應用系統的部署,更新,優化等工作。

3、負責應用服務故障的排查與解決,編制和匯總故障處理經驗。

4、負責應用系統的日常監控。編制和匯總伺服器狀態性能報告。

5、負責運維文檔的編寫與歸納。

任職要求

1、計算機相關專業本科及以上學歷。

2、具備優秀的計算機軟、硬體知識。並具備快速判斷和解決故障的能力。

3、三年以上Linux系統管理、網路管理及應用跨平台部署等相關工作經驗。

4、熟練掌握主流的Web應用軟體的配置和優化,並且有自動化運維經驗,能夠編寫日常運維腳本。

5、精通shell/perl/php/python中的一種或兩種編程語言。

6、熟練掌握各類開源監控系統(nagios,cacti,zabbix,puppet)的安裝和使用。

7、三年以上MySQL、mongodb、redis等資料庫使用經驗,精通sql語句。

8、能夠獨立分析問題、解決問題,具有較強的學習能力,有較強的責任心,善於團隊交流與合作。

Linux運維工程師的職責10

職責:

1、負責Windows、Linux系統平台下的各服務應用部署,日常維護分析解決。

2、改進業務監控方式,輔助完成持續實現7*24全鏈路監控。

3、針對伺服器出現緊急故障或時間,需及時響應並處理解決。

4、負責數據中心應用系統搭建、優化和日常維護,以及伺服器操作系統、應用系統、資料庫系統的維護和優化。

5、有進行過自動化,容器方面的獨立操作。docker,k8s,jenkins的部署和操作經驗豐富

6、按規范流程執行,並周期完善。

【崗位要求】

1、大專以上學歷,計算機網路相關專業,二年以上相關工作經驗。

2、具有良好的溝通能力、文檔編寫和文字表達能力、學習鑽研能力、問題分析與解決能力。

3、熟悉Shell編程,熟練掌握其他Python 或 Perl其中一個。

4、熟悉消息隊列、Zabbix、Jenkins、Redis、Docker、k8s、git等軟體的配置管理及應用。

5、熟悉MySQL,Sqlserver 資料庫安裝、配置。

6、有運維自動化平台相關經驗者優先。

7、細心、負責任、上進心、分享、協作,良好自我提升學習驅動意識態度。

4. Linux Shell 腳本編程最佳實踐

IT路邊社

前言

與其它的編碼規范一樣,這里所討論的不僅僅是編碼格式美不美觀的問題, 同時也討論一些約定及編碼標准。這份文檔主要側重於我們所普遍遵循的規則,對於那些不是明確強制要求的,我們盡量避免提供意見。

編碼規范對於程序員而言尤為重要,有以下幾個原因:

本文檔中的准則致力於最大限度達到以下原則:

盡管本文檔涵蓋了許多基礎知識,但應注意的是,沒有編碼規范可以為我們回答所有問題,開發人員始終需要再編寫完代碼後,對上述原則做出正確的判斷。

:未明確指明的則默認為必須(Mandatory)

主要參考如下文檔:

僅建議Shell用作相對簡單的實用工具或者包裝腳本。因此單個shell腳本內容不宜太過復雜。

在選擇何時使用shell腳本時時應遵循以下原則:

可執行文件不建議有擴展名,庫文件必須使用 .sh 作為擴展名,且應是不可執行的。

執行一個程序時,無需知道其編寫語言,且shell腳本並不要求具有擴展名,所以更傾向可執行文件沒有擴展名。

而庫文件知道其編寫語言十分重要,使用 .sh 作為特定語言後綴的擴展名,可以和其他語言編寫的庫文件加以區分。

文件名要求全部小寫, 可以包含下劃線 _ 或連字元 - , 建議可執行文件使用連字元,庫文件使用下劃線。

正例:

反例:

源文件編碼格式為UTF-8。避免不同操作系統對文件換行處理的方式不同,一律使用 LF 。

每行最多不超過120個字元。每行代碼最大長度限制的根本原因是過長的行會導致閱讀障礙,使得縮進失效。

除了以下兩種情況例外:

如出現長度必須超過120個字元的字元串,應盡量使用here document或者嵌入的換行符等合適的方法使其變短。

示例:

除了在行結束使用換行符,空格是源文件中唯一允許出現的空白字元。

對從來沒有用到的或者被注釋的方法、變數等要堅決從代碼中清理出去,避免過多垃圾造成干擾。

Bash 是唯一被允許使用的可執行腳本shell。

可執行文件必須以 #!/bin/bash 開始。請使用 set 來設置shell的選項,使得用 bash echo "Process $: Done making $$$."
# 示例7:命令參數及路徑不需要引號 grep -li Hugo /dev/ "$1"
# 示例8:常規變數用雙引號,ccs可能為空的特殊情況可不用引號 git send-email --to "${reviewers}" ${ccs:+"--cc" "${ccs}"}
# 示例9:正則用單引號,$1可能為空的特殊情況可不用引號 grep -cP '([Ss]pecial||?characters*) ${1:+"$1"}
# 示例10:位置參數傳遞推薦帶引號的"$@",所有參數作為單字元串傳遞用帶引號的"$*" # content of t.sh func_t { echo num: $# echo args: 1:$1 2:$2 3:$3 }
func_t "$@" func_t "$*" # 當執行 ./t.sh a b c 時輸出如下: num: 3 args: 1:a 2:b 3:c num: 1 args: 1:a b c 2: 3:

使用 $(command) 而不是反引號。

因反引號如果要嵌套則要求用反斜杠轉義內部的反引號。而 $(command) 形式的嵌套無需轉義,且可讀性更高。

正例:

反例:

條件測試

使用 [[ ... ]] ,而不是 [ , test , 和 /usr/bin/[ 。

因為在 [[ 和 ]] 之間不會出現路徑擴展或單詞切分,所以使用 [[ ... ]] 能夠減少犯錯。且 [[ ... ]] 支持正則表達式匹配,而 [ ... ] 不支持。參考以下示例:

盡可能使用變數引用,而非字元串過濾。

Bash可以很好的處理空字元串測試,請使用空/非空字元串測試方法,而不是過濾字元,讓代碼具有更高的可讀性。正例:

反例:

正例:

反例:

正例:

反例:

文件名擴展

當進行文件名的通配符擴展時,請指定明確的路徑。

當目錄中有特殊文件名如以 - 開頭的文件時,使用帶路徑的擴展通配符 ./* 比不帶路徑的 * 要安全很多。

應該避免使用eval。

Eval在用於分配變數時會修改輸入內容,但設置變數的同時並不能檢查這些變數是什麼。反例:

請使用進程替換或者for循環,而不是通過管道連接while循環。

這是因為在管道之後的while循環中,命令是在一個子shell中運行的,因此對變數的修改是不能傳遞給父shell的。

這種管道連接while循環中的隱式子shell使得bug定位非常困難。反例:

如果你確定輸入中不包含空格或者其他特殊符號(通常不是來自用戶輸入),則可以用for循環代替。例如:

使用進程替換可實現重定向輸出,但是請將命令放入顯式子 shell,而非 while 循環創建的隱式子 shell。例如:

總是檢查返回值,且提供有用的返回值。

對於非管道命令,使用 $? 或直接通過 if 語句來檢查以保持其簡潔。

例如:

當內建命令可以完成相同的任務時,在shell內建命令和調用外部命令之間,應盡量選擇內建命令。

因內建命令相比外部命令而言會產生更少的依賴,且多數情況調用內建命令比調用外部命令可以獲得更好的性能(通常外部命令會產生額外的進程開銷)。

正例:

反例:

載入外部庫文件不建議用使用.,建議使用source,已提升可閱讀性。正例:

反例:

除非必要情況,盡量使用單個命令及其參數組合來完成一項任務,而非多個命令加上管道的不必要組合。常見的不建議的用法例如:cat和grep連用過濾字元串; cat和wc連用統計行數; grep和wc連用統計行數等。

正例:

除特殊情況外,幾乎所有函數都不應該使用exit直接退出腳本,而應該使用return進行返回,以便後續邏輯中可以對錯誤進行處理。正例:

反例:

推薦以下工具幫助我們進行代碼的規范:

原文鏈接:http://itxx00.github.io/blog/2020/01/03/shell-standards/

獲取更多的面試題、腳本等運維資料點擊: 運維知識社區 獲取

腳本之---簡訊轟炸機

腳本之---QQ微信轟炸機

ansible---一鍵搭建redis5.0.5集群

elk7.9真集群docker部署文檔

全球最全loki部署及配置文檔

最強安全加固腳本2.0

一鍵設置iptbales腳本

5. Shell腳本語言優勢怎樣

Shell腳本語言的優勢在於處理偏操作系統底層的業務,例如:Linux系統內部的很多應用(有的是應用的一部分)都是使用Shell腳本開發的,因為有1000多個Linux系統命令為它做支撐,特別是Linux正則表達式及三劍客grep、sed、awk等命令。
對於一些常見的系統腳本使用Shell開發會更簡單、更快速,例如:讓軟體一鍵自動化安裝、優化,監控報警腳本,軟體啟動腳本,日誌分析腳本等,雖然PHP/Python語言也能夠做到這些,但是,考慮到掌握難度、開發效率、開發習慣等因素,它們可能就不如Shell腳本語言流行及有優勢了。對於一些常規的業務應用,使用Shell更符合Linux運維簡單、易用、高效的三大基本原則。
PHP語言的優勢在於小型網站系統的開發;Python語言的優勢在於開發較復雜的運維工具、Web界面的管理工具和Web業務的開發(例如:CMDB自動化運維平台、跳板機、批量管理軟體SaltStack、雲計算OpenStack軟體)等。我們在開發一個應用時應根據業務需求,結合不同語言的優勢及自身擅長的語言來選擇,揚長避短,從而達到高效開發及易於自身維護等目的。

6. shell腳本上

| 對於初學者而言,因為沒有實戰經驗,寫不出來 Shell 腳本 很正常,如果工作了幾年的運維老年還是寫不出來,那就是沒主動找需求,缺乏練習,缺乏經驗。針對以上問題,總結了30個生產環境中經典的 Shell 腳本 ,通過這些需求案例,希望能幫助大家提升Shell編寫思路,掌握編寫技巧。 |

先了解下編寫Shell過程中注意事項:

<pre style="margin: 0px; padding: 0px; overflow: auto; white-space: pre-wrap; color: rgb(51, 51, 51); font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">開頭加解釋器:#!/bin/bash
語法縮進,使用四個空格;多加註釋說明。
命名建議規則:變數名大寫、局部變數小寫,函數名小寫,名字體現出實際作用。
默認變數是全局的,在函數中變數local指定為局部變數,避免污染其他作用域。
有兩個 命令 能幫助我調試腳本:set -e 遇到執行非0時退出腳本,set-x 列印執行過程。
寫腳本一定先測試再到生產上。
</pre>

1、獲取隨機字元串或數字

<pre style="margin: 0px; padding: 0px; overflow: auto; white-space: pre-wrap; color: rgb(51, 51, 51); font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">獲取隨機8位字元串:
方法1:

471b94f2
方法2:

vg3BEg==
方法3:

ed9e032c

獲取隨機8位數字:
方法1:

23648321
方法2:

38571131
方法3:

69024815

cksum:列印CRC效驗和統計位元組
</pre>

2、定義一個顏色輸出字元串函數

<pre style="margin: 0px; padding: 0px; overflow: auto; white-space: pre-wrap; color: rgb(51, 51, 51); font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">方法1:
function echo_color() {
if [ 233[0m"
elif [ 233[0m"
fi
}
方法2:
function echo_color() {
case 2[0m"
;;
red)
echo -e "[31;40m$2[0m"
;;
*)
echo "Example: echo_color red string"
esac
}

使用方法:echo_color green "test"

function關鍵字定義一個函數,可加或不加。
</pre>

3、批量創建用戶

<pre style="margin: 0px; padding: 0px; overflow: auto; white-space: pre-wrap; color: rgb(51, 51, 51); font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">#!/bin/bash
DATE= 1 == "green" ]; then
echo -e "[32;40m 1 == "red" ]; then
echo -e "[31;40m$2[0m"
fi
}

if [ -s USER_FILE {DATE}.bak
echo_color green " {USER_FILE}- USER_FILE
echo "----------------" >> USER &>/dev/null; then
PASS= RANDOM |md5sum |cut -c 1-8)
useradd PASS |passwd --stdin USER USER_FILE
echo " USER User already exists!"
fi
done
</pre>

4、檢查軟體包是否安裝

<pre style="margin: 0px; padding: 0px; overflow: auto; white-space: pre-wrap; color: rgb(51, 51, 51); font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">#!/bin/bash
if rpm -q sysstat &>/dev/null; then
echo "sysstat is already installed."
else
echo "sysstat is not installed!"
fi
</pre>

5、檢查服務狀態

<pre style="margin: 0px; padding: 0px; overflow: auto; white-space: pre-wrap; color: rgb(51, 51, 51); font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">#!/bin/bash
PORT_C= (ps -ef |grep ntpd |grep -vc grep)
if [ PS_C -eq 0 ]; then
echo "內容" | mail -s "主題" [email protected]
fi
</pre>

6、檢查主機存活狀態

<pre style="margin: 0px; padding: 0px; overflow: auto; white-space: pre-wrap; color: rgb(51, 51, 51); font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">方法1:將錯誤IP放到數組裡面判斷是否ping失敗三次

IP_LIST="192.168.18.1 192.168.1.1 192.168.18.2"
for IP in NUM -le 3 ]; do
if ping -c 1 IP Ping is successful."
break
else
# echo " NUM"
FAIL_COUNT[ IP
let NUM++
fi
done
if [ {FAIL_COUNT[1]} Ping is failure!"
unset FAIL_COUNT[*]
fi
done

方法2:將錯誤次數放到FAIL_COUNT變數裡面判斷是否ping失敗三次

IP_LIST="192.168.18.1 192.168.1.1 192.168.18.2"
for IP in IP >/dev/null; then
echo " IP Ping is failure FAIL_COUNT -eq 3 ]; then
echo "$IP Ping is failure!"
fi
done

方法3:利用for循環將ping通就跳出循環繼續,如果不跳出就會走到列印ping失敗

ping_success_status() {
if ping -c 1 IP Ping is successful."
continue
fi
}
IP_LIST="192.168.18.1 192.168.1.1 192.168.18.2"
for IP in IP Ping is failure!"
done
</pre>

7、監控CPU、內存和硬碟利用率

<pre style="margin: 0px; padding: 0px; overflow: auto; white-space: pre-wrap; color: rgb(51, 51, 51); font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">1)CPU
藉助vmstat工具來分析CPU統計信息。

DATE= (ifconfig eth0 |awk -F [ :]+ /inet addr/{print (vmstat |awk NR==3{print (vmstat |awk NR==3{print (vmstat |awk NR==3{print (vmstat |awk NR==3{print (( SY))
if [ DATE
Host: USE
" | mail -s "CPU Monitor" $MAIL
fi

2)內存

DATE= (ifconfig eth0 |awk -F [ :]+ /inet addr/{print (free -m |awk /Mem/{print (free -m |awk /Mem/{print 6- (( USE))

if [ DATE
Host: TOTAL,Use= FREE
" | mail -s "Memory Monitor" $MAIL
fi

3)硬碟

DATE= (ifconfig eth0 |awk -F [ :]+ /inet addr/{print (fdisk -l |awk -F [: ]+ BEGIN{OFS="="}/^Disk /dev/{printf "%s=%sG,", 3} )
PART_USE= 1,int( 6} )
for i in (echo (echo (echo USE -gt 80 ]; then
echo "
Date: IP
Total: PART= MOUNT)
" | mail -s "Disk Monitor" $MAIL
fi
done
</pre>

8、批量主機磁碟利用率監控

<pre style="margin: 0px; padding: 0px; overflow: auto; white-space: pre-wrap; color: rgb(51, 51, 51); font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">前提監控端和被監控端SSH免交互登錄或者密鑰登錄。

寫一個配置文件保存被監控主機SSH連接信息,文件內容格式:IP User Port

HOST_INFO=host.info
for IP in 1} (awk -v ip= 1{print HOST_INFO)
PORT= IP ip== 3} PORT IP df -h > (awk BEGIN{OFS="="}/^/dev/{print 5)} USE_RATE_LIST; do
PART_NAME= {USE_RATE#*=}
if [ PART_NAME Partition usage $USE_RATE%!"
fi
done
done
</pre>

9、檢查網站可用性

<pre style="margin: 0px; padding: 0px; overflow: auto; white-space: pre-wrap; color: rgb(51, 51, 51); font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">1)檢查URL可用性
方法1:
check_url() {
HTTP_CODE= 1)
if [ 1 Access failure!"
fi
}
方法2:
check_url() {
if ! wget -T 10 --tries=1 --spider $1 >/dev/null 2>&1; then

}

使用方法:check_url www..com

2)判斷三次URL可用性
思路與上面檢查主機存活狀態一樣。

方法1:利用循環技巧,如果成功就跳出當前循環,否則執行到最後一行

check_url() {
HTTP_CODE= 1)
if [ URL_LIST; do
check_url URL
check_url URL Access failure!"
done

方法2:錯誤次數保存到變數

URL_LIST=" www..com www.agasgf.com "
for URL in (curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" HTTP_CODE -ne 200 ]; then
let FAIL_COUNT++
else
break
fi
done
if [ URL Access failure!"
fi
done

方法3:錯誤次數保存到數組

URL_LIST=" www..com www.agasgf.com "
for URL in NUM -le 3 ]; do
HTTP_CODE= URL)
if [ NUM]= NUM下標, {#FAIL_COUNT[ ]} -eq 3 ]; then
echo "Warning: $URL Access failure!"
unset FAIL_COUNT[ ] #清空數組
fi
done
</pre>

10、檢查MySQL主從同步狀態

<pre style="margin: 0px; padding: 0px; overflow: auto; white-space: pre-wrap; color: rgb(51, 51, 51); font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">#!/bin/bash
USER=bak
PASSWD=123456
IO_SQL_STATUS= USER -p 0} ) #gsub去除冒號後面的空格
for i in {i%:*}
THREAD_STATUS= THREAD_STATUS" != "Yes" ]; then
echo "Error: MySQL Master-Slave THREAD_STATUS!"
fi
done
</pre>

動手練一練,讓你的Shell功底上升一個段位!

7. python 運維常用腳本

Python 批量遍歷目錄文件,並修改訪問時間

import os

path = "D:/UASM64/include/"
dirs = os.listdir(path)
temp=[];

for file in dirs:
temp.append(os.path.join(path, file))
for x in temp:
os.utime(x, (1577808000, 1577808000))
Python 實現的自動化伺服器管理

import sys
import os
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

def ssh_cmd(user,passwd,port,userfile,cmd):

def ssh_put(user,passwd,source,target):

while True:
try:
shell=str(input("[Shell] # "))
if (shell == ""):
continue
elif (shell == "exit"):
exit()
elif (shell == "put"):
ssh_put("root","123123","./a.py","/root/a.py")
elif (shell =="cron"):
temp=input("輸入一個計劃任務: ")
temp1="(crontab -l; echo "+ temp + ") |crontab"
ssh_cmd("root","123123","22","./user_ip.conf",temp1)
elif (shell == "uncron"):
temp=input("輸入要刪除的計劃任務: ")
temp1="crontab -l | grep -v " "+ temp + "|crontab"
ssh_cmd("root","123123","22","./user_ip.conf",temp1)
else:
ssh_cmd("lyshark","123123","22","./user_ip.conf",shell)

遍歷目錄和文件

import os

def list_all_files(rootdir):
import os
_files = []
list = os.listdir(rootdir) #列出文件夾下所有的目錄與文件
for i in range(0,len(list)):
path = os.path.join(rootdir,list[i])
if os.path.isdir(path):
_files.extend(list_all_files(path))
if os.path.isfile(path):
_files.append(path)
return _files

a=list_all_files("C:/Users/LyShark/Desktop/a")
print(a)
python檢測指定埠狀態

import socket

sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sk.settimeout(1)

for ip in range(0,254):
try:
sk.connect(("192.168.1."+str(ip),443))
print("192.168.1.%d server open "%ip)
except Exception:
print("192.168.1.%d server not open"%ip)

sk.close()

python實現批量執行CMD命令

import sys
import os
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

print("------------------------------> ")
print("使用說明,在當前目錄創建ip.txt寫入ip地址")
print("------------------------------> ")

user=input("輸入用戶名:")
passwd=input("輸入密碼:")
port=input("輸入埠:")
cmd=input("輸入執行的命令:")

file = open("./ip.txt", "r")
line = file.readlines()

for i in range(len(line)):
print("對IP: %s 執行"%line[i].strip(' '))

python3-實現釘釘報警

import requests
import sys
import json

dingding_url = ' https://oapi.dingtalk.com/robot/send?access_token='

data = {"msgtype": "markdown","markdown": {"title": "監控","text": "apche異常"}}

headers = {'Content-Type':'application/json;charset=UTF-8'}

send_data = json.mps(data).encode('utf-8')
requests.post(url=dingding_url,data=send_data,headers=headers)

import psutil
import requests
import time
import os
import json

monitor_name = set(['httpd','cobblerd']) # 用戶指定監控的服務進程名稱

proc_dict = {}
proc_name = set() # 系統檢測的進程名稱
monitor_map = {
'httpd': 'systemctl restart httpd',
'cobblerd': 'systemctl restart cobblerd' # 系統在進程down掉後,自動重啟
}

dingding_url = ' https://oapi.dingtalk.com/robot/send?access_token='

while True:
for proc in psutil.process_iter(attrs=['pid','name']):
proc_dict[proc.info['pid']] = proc.info['name']
proc_name.add(proc.info['name'])

判斷指定埠是否開放

import socket

port_number = [135,443,80]

for index in port_number:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = sock.connect_ex((飗.0.0.1', index))
if result == 0:
print("Port %d is open" % index)
else:
print("Port %d is not open" % index)
sock.close()

判斷指定埠並且實現釘釘輪詢報警

import requests
import sys
import json
import socket
import time

def dingding(title,text):
dingding_url = ' https://oapi.dingtalk.com/robot/send?access_token='
data = {"msgtype": "markdown","markdown": {"title": title,"text": text}}
headers = {'Content-Type':'application/json;charset=UTF-8'}
send_data = json.mps(data).encode('utf-8')
requests.post(url=dingding_url,data=send_data,headers=headers)

def net_scan():
port_number = [80,135,443]
for index in port_number:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = sock.connect_ex((飗.0.0.1', index))
if result == 0:
print("Port %d is open" % index)
else:
return index
sock.close()

while True:
dingding("Warning",net_scan())
time.sleep(60)

python-實現SSH批量CMD執行命令

import sys
import os
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

def ssh_cmd(user,passwd,port,userfile,cmd):
file = open(userfile, "r")
line = file.readlines()
for i in range(len(line)):
print("對IP: %s 執行"%line[i].strip(' '))
ssh.connect(hostname=line[i].strip(' '),port=port,username=user,password=passwd)
cmd=cmd
stdin, stdout, stderr = ssh.exec_command(cmd)
result = stdout.read()

ssh_cmd("lyshark","123","22","./ip.txt","free -h |grep 'Mem:' |awk '{print $3}'")

用python寫一個列舉當前目錄以及所有子目錄下的文件,並列印出絕對路徑

import sys
import os

for root,dirs,files in os.walk("C://"):
for name in files:
print(os.path.join(root,name))
os.walk()

按照這樣的日期格式(xxxx-xx-xx)每日生成一個文件,例如今天生成的文件為2013-09-23.log, 並且把磁碟的使用情況寫到到這個文件中。

import os
import sys
import time

new_time = time.strftime("%Y-%m-%d")
disk_status = os.popen("df -h").readlines()

str1 = ''.join(disk_status)
f = open(new_time+'.log','w')
f.write("%s"%str1)

f.flush()
f.close()

統計出每個IP的訪問量有多少?(從日誌文件中查找)

import sys

list = []

f = open("/var/log/httpd/access_log","r")
str1 = f.readlines()
f.close()

for i in str1:
ip=i.split()[0]
list.append(ip)

list_num=set(list)

for j in list_num:
num=list.count(j)
print("%s -----> %s" %(num,j))

寫個程序,接受用戶輸入數字,並進行校驗,非數字給出錯誤提示,然後重新等待用戶輸入。

import tab
import sys

while True:
try:
num=int(input("輸入數字:").strip())
for x in range(2,num+1):
for y in range(2,x):
if x % y == 0:
break
else:
print(x)
except ValueError:
print("您輸入的不是數字")
except KeyboardInterrupt:
sys.exit(" ")

ps 可以查看進程的內存佔用大小,寫一個腳本計算一下所有進程所佔用內存大小的和。

import sys
import os

list=[]
sum=0

str1=os.popen("ps aux","r").readlines()

for i in str1:
str2=i.split()
new_rss=str2[5]
list.append(new_rss)
for i in list[1:-1]:
num=int(i)
sum=sum+num

print("%s ---> %s"%(list[0],sum))

關於Python 命令行參數argv

import sys

if len(sys.argv) < 2:
print ("沒有輸入任何參數")
sys.exit()

if sys.argv[1].startswith("-"):
option = sys.argv[1][1:]

利用random生成6位數字加字母隨機驗證碼

import sys
import random

rand=[]

for x in range(6):
y=random.randrange(0,5)
if y == 2 or y == 4:
num=random.randrange(0,9)
rand.append(str(num))
else:
temp=random.randrange(65,91)
c=chr(temp)
rand.append(c)
result="".join(rand)
print(result)

自動化-使用pexpect非交互登陸系統

import pexpect
import sys

ssh = pexpect.spawn('ssh [email protected]')
fout = file('sshlog.txt', 'w')
ssh.logfile = fout

ssh.expect("[email protected]'s password:")

ssh.sendline("密碼")
ssh.expect('#')

ssh.sendline('ls /home')
ssh.expect('#')

Python-取系統時間

import sys
import time

time_str = time.strftime("日期:%Y-%m-%d",time.localtime())
print(time_str)

time_str= time.strftime("時間:%H:%M",time.localtime())
print(time_str)

psutil-獲取內存使用情況

import sys
import os
import psutil

memory_convent = 1024 * 1024
mem =psutil.virtual_memory()

print("內存容量為:"+str(mem.total/(memory_convent))+"MB ")
print("已使用內存:"+str(mem.used/(memory_convent))+"MB ")
print("可用內存:"+str(mem.total/(memory_convent)-mem.used/(1024*1024))+"MB ")
print("buffer容量:"+str(mem.buffers/( memory_convent ))+"MB ")
print("cache容量:"+str(mem.cached/(memory_convent))+"MB ")

Python-通過SNMP協議監控CPU
注意:被監控的機器上需要支持snmp協議 yum install -y net-snmp*

import os

def getAllitems(host, oid):
sn1 = os.popen('snmpwalk -v 2c -c public ' + host + ' ' + oid + '|grep Raw|grep Cpu|grep -v Kernel').read().split(' ')[:-1]
return sn1

def getDate(host):
items = getAllitems(host, '.1.3.6.1.4.1.2021.11')

if name == ' main ':

Python-通過SNMP協議監控系統負載
注意:被監控的機器上需要支持snmp協議 yum install -y net-snmp*

import os
import sys

def getAllitems(host, oid):
sn1 = os.popen('snmpwalk -v 2c -c public ' + host + ' ' + oid).read().split(' ')
return sn1

def getload(host,loid):
load_oids = Ƈ.3.6.1.4.1.2021.10.1.3.' + str(loid)
return getAllitems(host,load_oids)[0].split(':')[3]

if name == ' main ':

Python-通過SNMP協議監控內存
注意:被監控的機器上需要支持snmp協議 yum install -y net-snmp*

import os

def getAllitems(host, oid):

def getSwapTotal(host):

def getSwapUsed(host):

def getMemTotal(host):

def getMemUsed(host):

if name == ' main ':

Python-通過SNMP協議監控磁碟
注意:被監控的機器上需要支持snmp協議 yum install -y net-snmp*

import re
import os

def getAllitems(host,oid):

def getDate(source,newitem):

def getRealDate(item1,item2,listname):

def caculateDiskUsedRate(host):

if name == ' main ':

Python-通過SNMP協議監控網卡流量
注意:被監控的機器上需要支持snmp協議 yum install -y net-snmp*

import re
import os

def getAllitems(host,oid):
sn1 = os.popen('snmpwalk -v 2c -c public ' + host + ' ' + oid).read().split(' ')[:-1]
return sn1

def getDevices(host):
device_mib = getAllitems(host,'RFC1213-MIB::ifDescr')
device_list = []

def getDate(host,oid):
date_mib = getAllitems(host,oid)[1:]
date = []

if name == ' main ':

Python-實現多級菜單

import os
import sys

ps="[None]->"
ip=["192.168.1.1","192.168.1.2","192.168.1.3"]
flage=1

while True:
ps="[None]->"
temp=input(ps)
if (temp=="test"):
print("test page !!!!")
elif(temp=="user"):
while (flage == 1):
ps="[User]->"
temp1=input(ps)
if(temp1 =="exit"):
flage=0
break
elif(temp1=="show"):
for i in range(len(ip)):
print(i)

Python實現一個沒用的東西

import sys

ps="[root@localhost]# "
ip=["192.168.1.1","192.168.1.2","192.168.1.3"]

while True:
temp=input(ps)
temp1=temp.split()

檢查各個進程讀寫的磁碟IO

import sys
import os
import time
import signal
import re

class DiskIO:
def init (self, pname=None, pid=None, reads=0, writes=0):
self.pname = pname
self.pid = pid
self.reads = 0
self.writes = 0

def main():
argc = len(sys.argv)
if argc != 1:
print ("usage: please run this script like [./lyshark.py]")
sys.exit(0)
if os.getuid() != 0:
print ("Error: This script must be run as root")
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
os.system('echo 1 > /proc/sys/vm/block_mp')
print ("TASK PID READ WRITE")
while True:
os.system('dmesg -c > /tmp/diskio.log')
l = []
f = open('/tmp/diskio.log', 'r')
line = f.readline()
while line:
m = re.match(
'^(S+)(d+)(d+): (READ|WRITE) block (d+) on (S+)', line)
if m != None:
if not l:
l.append(DiskIO(m.group(1), m.group(2)))
line = f.readline()
continue
found = False
for item in l:
if item.pid == m.group(2):
found = True
if m.group(3) == "READ":
item.reads = item.reads + 1
elif m.group(3) == "WRITE":
item.writes = item.writes + 1
if not found:
l.append(DiskIO(m.group(1), m.group(2)))
line = f.readline()
time.sleep(1)
for item in l:
print ("%-10s %10s %10d %10d" %
(item.pname, item.pid, item.reads, item.writes))
def signal_handler(signal, frame):
os.system('echo 0 > /proc/sys/vm/block_mp')
sys.exit(0)

if name ==" main ":
main()

利用Pexpect實現自動非交互登陸linux

import pexpect
import sys

ssh = pexpect.spawn('ssh [email protected]')
fout = file('sshlog.log', 'w')
ssh.logfile = fout

ssh.expect("[email protected]'s password:")

ssh.sendline("密碼")

ssh.expect('#')
ssh.sendline('ls /home')
ssh.expect('#')

利用psutil模塊獲取系統的各種統計信息

import sys
import psutil
import time
import os

time_str = time.strftime( "%Y-%m-%d", time.localtime( ) )
file_name = "./" + time_str + ".log"

if os.path.exists ( file_name ) == False :
os.mknod( file_name )
handle = open ( file_name , "w" )
else :
handle = open ( file_name , "a" )

if len( sys.argv ) == 1 :
print_type = 1
else :
print_type = 2

def isset ( list_arr , name ) :
if name in list_arr :
return True
else :
return False

print_str = "";

if ( print_type == 1 ) or isset( sys.argv,"mem" ) :
memory_convent = 1024 * 1024
mem = psutil.virtual_memory()
print_str += " 內存狀態如下: "
print_str = print_str + " 系統的內存容量為: "+str( mem.total/( memory_convent ) ) + " MB "
print_str = print_str + " 系統的內存以使用容量為: "+str( mem.used/( memory_convent ) ) + " MB "
print_str = print_str + " 系統可用的內存容量為: "+str( mem.total/( memory_convent ) - mem.used/( 1024*1024 )) + "MB "
print_str = print_str + " 內存的buffer容量為: "+str( mem.buffers/( memory_convent ) ) + " MB "
print_str = print_str + " 內存的cache容量為:" +str( mem.cached/( memory_convent ) ) + " MB "

if ( print_type == 1 ) or isset( sys.argv,"cpu" ) :
print_str += " CPU狀態如下: "
cpu_status = psutil.cpu_times()
print_str = print_str + " user = " + str( cpu_status.user ) + " "
print_str = print_str + " nice = " + str( cpu_status.nice ) + " "
print_str = print_str + " system = " + str( cpu_status.system ) + " "
print_str = print_str + " idle = " + str ( cpu_status.idle ) + " "
print_str = print_str + " iowait = " + str ( cpu_status.iowait ) + " "
print_str = print_str + " irq = " + str( cpu_status.irq ) + " "
print_str = print_str + " softirq = " + str ( cpu_status.softirq ) + " "
print_str = print_str + " steal = " + str ( cpu_status.steal ) + " "
print_str = print_str + " guest = " + str ( cpu_status.guest ) + " "

if ( print_type == 1 ) or isset ( sys.argv,"disk" ) :
print_str += " 硬碟信息如下: "
disk_status = psutil.disk_partitions()
for item in disk_status :
print_str = print_str + " "+ str( item ) + " "

if ( print_type == 1 ) or isset ( sys.argv,"user" ) :
print_str += " 登錄用戶信息如下: "
user_status = psutil.users()
for item in user_status :
print_str = print_str + " "+ str( item ) + " "

print_str += "--------------------------------------------------------------- "
print ( print_str )
handle.write( print_str )
handle.close()

import psutil

mem = psutil.virtual_memory()
print mem.total,mem.used,mem
print psutil.swap_memory() # 輸出獲取SWAP分區信息

cpu = psutil.cpu_stats()
printcpu.interrupts,cpu.ctx_switches

psutil.cpu_times(percpu=True) # 輸出每個核心的詳細CPU信息
psutil.cpu_times().user # 獲取CPU的單項數據 [用戶態CPU的數據]
psutil.cpu_count() # 獲取CPU邏輯核心數,默認logical=True
psutil.cpu_count(logical=False) # 獲取CPU物理核心數

psutil.disk_partitions() # 列出全部的分區信息
psutil.disk_usage('/') # 顯示出指定的掛載點情況【位元組為單位】
psutil.disk_io_counters() # 磁碟總的IO個數
psutil.disk_io_counters(perdisk=True) # 獲取單個分區IO個數

psutil.net_io_counter() 獲取網路總的IO,默認參數pernic=False
psutil.net_io_counter(pernic=Ture)獲取網路各個網卡的IO

psutil.pids() # 列出所有進程的pid號
p = psutil.Process(2047)
p.name() 列出進程名稱
p.exe() 列出進程bin路徑
p.cwd() 列出進程工作目錄的絕對路徑
p.status()進程當前狀態[sleep等狀態]
p.create_time() 進程創建的時間 [時間戳格式]
p.uids()
p.gids()
p.cputimes() 【進程的CPU時間,包括用戶態、內核態】
p.cpu_affinity() # 顯示CPU親緣關系
p.memory_percent() 進程內存利用率
p.meminfo() 進程的RSS、VMS信息
p.io_counters() 進程IO信息,包括讀寫IO數及位元組數
p.connections() 返回打開進程socket的nametples列表
p.num_threads() 進程打開的線程數

import psutil
from subprocess import PIPE
p =psutil.Popen(["/usr/bin/python" ,"-c","print 'helloworld'"],stdout=PIPE)
p.name()
p.username()
p.communicate()
p.cpu_times()

psutil.users() # 顯示當前登錄的用戶,和Linux的who命令差不多

psutil.boot_time() 結果是個UNIX時間戳,下面我們來轉換它為標准時間格式,如下:
datetime.datetime.fromtimestamp(psutil.boot_time()) # 得出的結果不是str格式,繼續進行轉換 datetime.datetime.fromtimestamp(psutil.boot_time()).strftime('%Y-%m-%d%H:%M:%S')

Python生成一個隨機密碼

import random, string
def GenPassword(length):

if name == ' main ':
print (GenPassword(6))

8. shell腳本是什麼

當執行命令或程序語句是通過程序文件而不是命令行,那這個程序被稱為Shell腳本。如果Shell腳本內置很多命令、語句及循環控制,然後一次性執行完畢,這種通過文件執行腳本的方式稱為非交互方式。用戶可以在Shell腳本中輸入一系列命令及命令語句組合。這些命令、變數和流程式控制制語句等有機地結合在一起,就形成一個功能強大的Shell腳本。

9. Shell腳本編程實戰

做 Java 的肯定都接觸過 Linux 系統,那麼很多時候我們在開發的過程中都是把我們項目打成一個jar包,或者是war包的形式,然後通過 XFTP 上傳到我們伺服器的指定目錄,然後運行一端啟動腳本,讓我們的項目變得可以訪問 就像 ./sh service.sh start 然後啟動我們寫好的 sh 的shell腳本。接下來我們就來學習一下關於 Shell 腳本是如何寫出來的。

Shell 腳本是什麼?Shell是一個命令解釋器,它的作用是解釋執行用戶輸入的命令及程序等,也就是說,我們用戶每輸入一條命令,Shell 就會相對應的執行一條命令。當命令或程序語句不在命令行下執行,而是通過一個程序文件來執行時,該程序文件就被稱為Shell腳本。

在我們的 Shell 腳本中,會有各種各樣的內容,賦值,計算,循環等一系列的操作,接下來我們就來看看這個 Shell 腳本怎麼寫吧

1.查看自己當前系統默認的 Shell

echo $SHELL

輸出:/bin/bash

2.查看系統支持的Shell

cat /etc/shells

輸出:

/bin/sh /bin/bash /usr/bin/sh /usr/bin/bash

也就是說,我們的雲伺服器是支持我們在這里給他安排 Shell 腳本的

我們這時候先來安排一下 sh 的文件,創建一個文件夾,然後在其中創建一個 sh 的文件。

mkdir /usr/local/shelltest

touch test.sh

創建完成我們編輯一下內容

vim test.sh

然後我們出來運行一下我們的 Shell 的第一個腳本

bash test.sh

出來的結果是 Hello World Shell

一個及其簡單的腳本出現了,接下我們就分析一波我們寫了點啥?

#!/bin/bash

#! 是一個約定的標記,它告訴系統這個腳本需要什麼解釋器來執行,即使用哪一種 Shell

我們在之前也使用了 echo $SHELL 來查看了自己系統默認的是哪一種 sh 解析器,之前看到的是/bin/bash,所以我們在寫 Shell 腳本的時候,我們在開頭默認的約定中,我們寫了這個是用 /bin/bash 來進行解釋的,

那麼我們如何像之前調用我們的當前目錄中的 Shell 腳本一樣去調用他呢?就像這個樣子的 ./sh service.sh start

1.授權,

我們先不授權試一下看看能通過 ./test.sh 進行調用么

bash: ./test.sh: Permission denied 會提示這個,也就是沒有授權定義,

授權命令:chmod +x test.sh

2.執行 ./test.sh

然後調用就能正常輸出了,就是說,在當前的目錄下執行這個腳本命令。

變數命名實際上很簡單,我們先來試一下

name=yikeji

這時候我們怎麼使用變數呢?實際上只要在前面加上一個符號就可以 $

echo $name

上面的兩種寫法都是可以的,外面的大括弧加和不加區別不大,可以省略,直接就 $name 就可以使用你定義的變數

使用括弧的意義一般在於區別某些變數,比如你寫了一串的內容,可能寫的是 echo $nameismyfriend ,如果連在一起,是不是有點尷尬,這時候就可以使用括弧區別一下, echo ${name}ismyfriend 不使用括弧的時候,他就去找nameismyfriend這個變數了,就無法出來我們要的效果。

unset name

這時候我們就把我們剛才定義的 name=yikeji 這個變數給去掉了,我們可以調用一下我們的變數看是什麼?

echo $name

這是不是就證明我們自己定義的變數已經刪除了

那麼我們需要一個關鍵字,大家肯定能想到是什麼關鍵字 readonly

我們先給name賦值,然後使用 readonly 設置只讀,然後再改變一下試試,

竟然是真的,如果不設置只讀,是不是會重新可以進行賦值,我們測試個年齡,

所以我們就可以肯定,readonly就是設置只讀的關鍵詞,記住了么?

那麼設置只讀的變數可以刪除么?畢竟總有杠精的面試官會提問這個棘手的問題,但是,阿粉試過的所有方式好像都是不行的,阿粉就直接重啟了自己的伺服器,這樣臨時的變數就不存在了!

說真的,Shell腳本的流程式控制制數一般才是yyds,為什麼這么說,因為你在寫大部分的腳本的時候,流程式控制制的地方永遠是最多的,判斷,選擇,等等一系列的函數,當時熟練使用的時候,就發現這東西確實很有意思。

我們先說最簡單的 if else 這也是我們最經常使用的判斷,在寫 Shell 腳本的時候,就不像我們的 Java 中直接寫

Xshell 中的語法就不是這個樣子的, Xshell 語法:

末尾的 fi 就是 if 倒過來拼寫,我們可以寫一個 if 的腳本試一下這個流程能否理解。

這里申明一下,

我們在上面這段腳本中寫就是內容就是,我們給腳本傳入一個值,然後比對這個值和2的大小關系,然後輸出我們指定的內容。

運行後就能看到

$1 表示我們給 Shell 腳本輸入的第一個參數, $0 就是你寫的shell腳本本身的名字,$2 是我們給 Shell 腳本傳的第二個參數

大家在部署某些項目的時候,是不是啟動命令就很簡潔,就是 sh service.sh start 類似這種的,那我們來看看一般這種是怎麼寫的,這就用到了另外一塊的內容,和 if 類似,在 Java 中也有,那就是 Case .

我們先來看看 Case 的語法,

case ... esac 實際上就和 Java 中的 Case 是非常相似的,case 語句匹配一個值與一個模式,如果匹配成功,執行相匹配的命令. esac 是一個結束的標志。

光說不練,假把式,我們來搞一下試試寫一個腳本來搞一下。就用我們剛才說的 sh servic.sh start 來進行測試。

我們來看看運行結果

那麼這段 Shell 腳本是什麼意思呢?其實很簡單,匹配我們傳入的第一個字元,和 start 還有 stop 進行比較,如果匹配上之後,輸出命令,最後退出即可。

是不是感覺沒有那麼復雜了呢?

說到流程式控制制,那麼肯定不能不說 for , 畢竟 for 循環在 Java 中那可是重頭戲。

我們先看他的格式

那麼我們有沒有說像是 Java 中那種 for 循環一樣的方式呢?比如說這個 for ((i=1; i<=j; i++))

實際上也是支持這種的,我們來寫一個試試。

執行一下看看

既然有 for 那是不是就有 while 呢?是的,沒錯,確實是有 while ,也是循環的意思,但是寫法有略微不一樣的地方

我們來舉個嘗試列印九九乘法表來看一下

是不是也挺簡單的?

其實 Shell 腳本的編寫一般都是在實際應用中提升,單純的寫測試腳本,也是可以讓自己對知識的掌握比較充分,而我們一般都是寫一些比較簡單的腳本,復雜的不是還有運維么?

10. 請用shell寫個腳本,當apache的進程數大於10的時候發郵件給運維部

#!/bin/bash
count=`ps -ef | grep [a]pache | wc -l`
if [ $count -gt 10 ]; then
mail -s 標題 [email protected] <<!!
內容
.

!!
fi
###################
說明一下,count計算的時候,grep後面改成你真正的apache的進程名,[a]pache首字母加了個方括弧是為了防止把grep本身的進程數也算進去。
mail後面的標題,地址和內容改成你自己需要的內容。
在內容的後面那個.不要漏掉。
count=後面的引號是鍵盤上數字1左邊那個重音符號,而不是單雙引號那個引號。

這個腳本有個前提,你本機的sendmail服務是可用的,否則這個腳本是發不出郵件的。
至於sendmail服務,那就是另外的話題了。需要配置的話請google一下。