<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          運維老司機實戰(zhàn)中的 Shell 開發(fā)經(jīng)驗總結

          共 3503字,需瀏覽 8分鐘

           ·

          2021-07-03 14:10

          點擊“程序員面試吧”,選擇“星標??”

          下拉至文末”查看更多

          無論是系統(tǒng)運維,還是應用運維,均可分為“純手工”—> “腳本化”—> “自動化”—>“智能化”幾個階段,其中自動化階段,主要是將一些重復性人工操作和運維經(jīng)驗封裝為程序或腳本,一方面避免重復性操作及風險,另一方面提高執(zhí)行效率。在自動化運維的轉變過程中,經(jīng)常使用的可能就是shell腳本了,今天主要分享下shell腳本開發(fā)在運維工作中的一些經(jīng)驗總結。

          小腳本有大智慧,別小看幾十行代碼,夾雜著系統(tǒng)設計、代碼規(guī)范和操作經(jīng)驗等等細節(jié),在建設自動化運維的工作中,還是很值得我們研究學習的,下面總結這些也都是源于各位腳本達人和我們在自身工作中“遇到的坑”、“摔過的跟頭”和“排過的雷”,與大家共享。

          這里主要介紹并參考我行已經(jīng)形成的一些shell編寫規(guī)范,編寫時嚴格遵守這些規(guī)范,不僅使編寫人受益,同時也能提高使用者的執(zhí)行效率。

          1)腳本開頭部分應有腳本功能說明、參數(shù)使用說明、作者姓名、創(chuàng)建/修改日期、版本信息,格式為:

          2)腳本編寫時,注意格式對齊,如所有的循環(huán)或者判斷語句前后的語句進行對齊,以及case的選取完全,如:

          3)腳本開頭執(zhí)行時,執(zhí)行如下命令,在執(zhí)行過程中若遇到使用了未定義的變量或命令返回值為非零,將直接報錯退出:

          4)建議將命令行的每個參數(shù)放在單引號、雙引號中,特別是rm、mv等可能對生產(chǎn)現(xiàn)有數(shù)據(jù)造成修改的操作,建議使用垃圾箱策略:rm操作轉意為mv操作,制定文件保存目錄,以防回退,并定期清理:

          5)命令行中參數(shù)需要使用‘*’、‘?’通配符的,應依據(jù)最精確匹配原則,如能確定文件、目錄名稱的前綴、后綴、擴展名及其他可識別關鍵字的,須在參數(shù)中包含該信息,如能確定文件、目錄的長度應使用‘?’通配符,不得使用‘*’,推薦的使用方式:

          不推薦使用的方式:

          禁止使用的方式:

          6)給數(shù)值型變量的賦值后,需由手段保證變量的值為數(shù)值型,避免在后續(xù)的處理中出現(xiàn)異常:

          7)在判斷條件中使用的變量,必須包含在雙引號中,如:

          禁止使用的方式:

          8)對文件進行打包備份時,必須使用相對路徑進行打包,如:

          嚴禁將全路徑打入tar包, 如:

          9)對于打包后還需進行壓縮的文件,建議使用管道進行處理,如:

          不建議兩部分分開執(zhí)行:

          10)使用ps命令篩選進程時,如能確定進程所屬用戶,必須在參數(shù)中指定用戶名稱,如其輸出作為kill命令的輸入,則必須指定進程所屬用戶,如:

          這里介紹的主要是日常shell編寫中遇到比較隱蔽或看似簡單,卻難以發(fā)現(xiàn)的“坑”,編寫中應盡量避免使用,使用更優(yōu)的方法避免重蹈覆轍。

          1)更新文件使用>不用cp

          使用>修改和回退文件時,保留原文件的屬組和權限,避免使用cp時權限屬組被修改。

          2)使用kill前確認

          關鍵字用-w 精確匹配字段;

          kill前后都保留現(xiàn)場, 兩次ps -ef|grep -w 關鍵字|grep -v grep >>/tmp/kill_進程名_.backup;

          刪除前要校驗,獲取進程號是否唯一,避免多殺或誤殺的情況。

          3)使用rm前確認

          刪除前備份刪除對象信息,避免使用變量,直接使用文件和目錄名;

          如果必須使用時,刪除前,建議檢查避免誤刪,刪除目錄和文件信息保留:

          建議禁用find遍歷根目錄進行查找,同時刪除前進行確認,避免多刪或誤刪的情況。

          4)For循環(huán)的坑

          for循環(huán)的in條件按空格來區(qū)分,避免進入不正確或死循環(huán)。

          5)while循環(huán)的禁忌

          如果還想使用循環(huán)中的變量,不要while結合管道使用。

          6)慎用cp

          這句話基本上正確,但同樣有空格分詞的問題。所以應當用雙引號:

          但是如果湊巧文件名以 - 開頭,這個文件名會被 cp 當作命令行選項來處理。

          可以試試下面這個:  

          但也可能再碰上一個不支持 -- 選項的系統(tǒng),所以最好用下面的方法: 

          7)慎用cd

          避免使用cd到操作目錄再操作的方式,可能導致進入目錄失敗,誤刪除,如:

          建議如下:

          8)     用[[  ]]代替[ ]

          當$var為空時,上面的命令就變成了[ ="bar" ]

          類似地,當$var包含空格時:

          [ space words here = "var" ]兩者都會出錯。所以應當用雙引號將變量括起來:

          [ "$var" = var ]  幾乎完美了。

          但是,當$var以 - 開頭時依然會有問題。在較新的bash中你可以用下面的方法來代替,[[ ]]關鍵字能正確處理空白、空格、帶橫線等問題。

          另注意,[[適用于字符串,如果是數(shù)值,要用如:(( $var > 8 ))

          9)管道操作中不要同時讀寫文件

          你不能在同一條管道操作中同時讀寫一個文件。根據(jù)管道的實現(xiàn)方式,file要么被截斷成0字節(jié),要么會無限增長直到填滿整個硬盤。如果想改變原文件的內(nèi)容,只能先將輸出寫到臨時文件中再用mv命令。

          10)cd的易錯問題

          cd 有可能會出錯,導致要執(zhí)行的命令就會在你預想不到的目錄里執(zhí)行了。所以一定要記得判斷cd的返回值。

          如果你要根據(jù)cd的返回值執(zhí)行多條命令,可以用 ||。

          關于目錄的一點題外話,假設你要在shell程序中頻繁變換工作目錄,如下面的代碼:

          不如這樣寫:

          括號會強制啟動一個子shell,這樣在這個子shell中改變工作目錄不會影響父shell(執(zhí)行這個腳本的shell),就可以省掉cd - 的麻煩。

          目前行里自動化工具越來越多,無論是應用的MAOP或系統(tǒng)的SMDB,自動化實現(xiàn)都還是日常運維腳本的調(diào)用,結合日常運維的一些經(jīng)驗,腳本中就更需要考慮周全和控制風險。這里介紹一些結合運維場景的腳本應用,希望規(guī)避以前犯過的錯,重點在控制風險。

          1)     支持交互式腳本的應用

          很多腳本中需要進行交互,在規(guī)避風險的同時,需要通過自動化工具發(fā)布來支持交互,可以使用expect,示例如下:

          也可以使用curl工具來替代簡單的交互:

          FTP SFTP下載

          curl-u ftpuser:ftppassword -O "sftp://ftp_ip:ftp_port/pathfile"

          FTP SFTP上傳

          curl-u ftpuser:ftppassword  --ftp-create-dirs-T upfile "sftp://ftp_ip:ftp_port/filepath/upfile"

          2)腳本規(guī)范執(zhí)行和日志追溯

          直接執(zhí)行的腳本很危險,要提示用戶如何使用腳本,并記錄日志以便跟蹤。

          示例如下:

          3)腳本的并發(fā)鎖控制

          避免多人同時執(zhí)行或并發(fā)同時執(zhí)行的異常問題,建議增加鎖機制,示例如下:

          4)控制腳本不退出的風險

          周期頻繁執(zhí)行的腳本,需要防止腳本hang住不退出,導致后續(xù)腳本再次執(zhí)行。

          5)避免集中發(fā)布腳本造成的風險

          使用ftp、sftp傳輸、下載文件,或者集中訪問存儲端口時,盡量增加發(fā)布對象散列,避免集中操作造成存儲端口擁堵,跨防火墻流量超限報警等影響。

          6)避免文件無限增長的風險

          向一個文件中追加數(shù)據(jù)時,一定要設置閥值,必要時清空,避免文件無限增大:

          目錄增加清理過期文件策略,避免產(chǎn)生的文件越來越多,造成文件節(jié)點用盡:

          目錄中的文件過多,會報參數(shù)太長錯誤無法刪除,建議放在循環(huán)中遍歷刪除:

          總結:

          鑒于以上腳本,我們可以從中汲取一些經(jīng)驗,規(guī)避一些風險:

          通過增加日志記錄輸出和腳本執(zhí)行的方法說明,并自動交互和傳遞參數(shù),避免執(zhí)行腳本的操作風險;利用文件鎖機制和運維中一些規(guī)避風險的方法,使得腳本自動執(zhí)行起來更便捷更安全。

          1.通過規(guī)范類腳本的定義,標準常量定義、清晰的注釋、函數(shù)和變量大小寫用法,細節(jié)中可以看出嚴謹,即使只有幾行,也能體現(xiàn)出一名優(yōu)秀腳本開發(fā)人員的素質(zhì)。

          2.通過易錯類腳本中的“坑”,使得 shell面向過程的編寫更得心應手,讓腳本規(guī)范的同時,邏輯也更嚴謹清晰,避免了錯誤,也提高了腳本的開發(fā)效率。

          3.通過運維場景的腳本應用,規(guī)避各種開發(fā)和執(zhí)行過程中的風險,使得shell腳本不僅能支持自動化發(fā)布,更可以全面智能化的為運維服務。

          https://blog.csdn.net/cpongo2ppp1/article/details/90172429

          轉自:杰哥的it之旅

          瀏覽 31
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91久久成人 | 特级西西高清4Www电影 | 亚洲操逼网| 人人干人人操人人 | 91精品国产欧美一区二区百度云 |