Systemd服務啓動管理以及awk命令詳解

1、簡述systemd的新特性及unit常見類型分析,能夠實現編譯安裝的如nginx\apache實現通過systemd來管理


Systemd:

    POST--BIOS--Bootloader(MBR)--Kernel(ramdisk)--rootfs--/sbin/init

      init:

         CentOS 5:Sysv init

         CentOS 6:Upstart

         CentOS 7:systemd



      systemd的特性:

         系統引導時實現服務並運行啓動

         按需激活選項

         系統狀態快照

         基於依賴關係定義控制邏輯


      核心概念:Unit

         Unit由其相關配置文件進行標識、識別和配置,文件中主要包含了系統服務、監聽的socket,保存的快照以及其他與init相關的信息,這些配置文件主要保存


在:

              /usr/lib/systemd/system

              /run/systemd/system

              /etc/systemd/system


         Unit的常見類型:

             Serveice unit:文件拓展名爲.service,用於定義系統服務

             Target unit:文件拓展名爲.target,用於模擬實現“運行級別”

             Device unit:文件拓展名爲.device,用於定義內核識別的設備

             Mount unit:文件拓展名爲.mount,定義文件系統掛載點

             Socket unit:文件拓展名爲.socket,用於標識進程間通信用到的socket文件

             Snapshot unit:文件拓展名爲.snpashot管理系統快照

             Swap unit:文件拓展名爲.swap,用於標識swap設備

             Automount unit:文件拓展名爲.automount,定義文件系統自動掛載點設備

             Path unit:文件拓展名爲.path用於定義文件系統中的文件或目錄

         

         關鍵特性:

             基於socket的激活機制:socket與程序分離

             基於bus的激活機制

             基於device的激活機制

             基於path的激活機制

             系統快照:保存各unit的當前狀態信息與持久存儲設備中

             向後兼容sysv init腳本

                 /etc/init.d/



         不兼容:

             systemctl的命令是固定不變的

             非由systemctl啓動的服務,systemctl無法與之通信



         

         管理系統服務:

             CentOS 7:service類型的unit文件


                 systemctl命令:- Control the systemd system and service manager


                     systemctl [OPTIONS...] COMMAND [NAME...]

                         啓動:service NAME start ==>systemctl start NAME.service

                         停止:service NAME stop ==>systemctl stop NAME.service

                         重啓:service NAME restart ==>systemctl restart NAME.service

                         狀態:service NAME status ==>systemctl status NAME.service

                         條件式重啓:service NAME condrestart ==>systemctl try-restart NAME.service

                         重載或重啓服務:systemctl reload-or-restart NAME.service

                         重載或條件式重啓服務:systemctl reload-or-try-restart NAME.service


                         查看某服務當前激活與否的狀態:systemctl ls-active NAME.service

                         查看所有已激活的服務:systemctl list-units --type service

                         查看所有服務(已激活及未激活):chkconfig --list ==>systemctl list-units -t service --all


                         設置服務開機啓動:chkconfig NAME on ==>systemctl enable NAME.service

                         禁止服務開機啓動:chkconfig NAME off ==>systemctl disable NAME.service 

                         查看某服務是否能開機自啓:chkconfig --list NAME ==>systemctl ls-enabled NAME.service


                         禁止某服務設定爲開機啓動:systemctl mask NAME.service

                         取消此禁止:systemctl unmask NAME.service


                         查看服務的依賴關係:systemctl list-dependencies NAME.service


         管理target unit

             運行級別:

                0 ==>runlevel0.target,poweroff.target

                1 ==>runlevel1.target,rescue.target

                2 ==>runlevel2.target,multi-user.target

                3 ==>runlevel3.target,multi-user.target

                4 ==>runlevel4.target,multi-user.target

                5 ==>runlevel5.target,graphical.target

                6 ==>runlevel6.target,reboot.target



             級別切換:init N ==>systemctl isolate NAME.target


             查看級別:runlevel ==>systemctl list-units --type target

             查看所有級別:systemctl list-units -t target -a


             獲取默認運行級別:systemctl get-default

             修改默認運行級別:systemctl set-default NAME.service


             切換至緊急救援模式:systemctl rescue

             切換至emergency模式:systemctl emergency


         其他常用命令:

             關機:systemctl halt,systemctl poweroff

             重啓:systemctlreboot

             掛起:systemctl suspend

             快照:systemctl hibernate

             快照並掛起:systemctl hybrid-sleep



        service unit file:

             文件通常由三部分組成:

                 [Unit]:定義與unit類型無關的通用選項;用於提供unit的描述信息、unit行爲及依賴關係等

                 [Service]:與特定類型相關的專用選項;此處爲Service類型

                 [Install]:定義由"systemctl enable"以及"systemctl disable"命令在實現服務啓用後禁用時用到的一些選項



             Unit段的常用選項:

                 Description:描述信息,意義性描述

                 After:定義unit的啓動順序,表示當前unit應該晚於哪些unit啓動,其功能與Before相反

                 Requies:依賴到的其他units,強依賴,被依賴的units無法激活時,當前unit即無法激活

                 Wants:依賴到的其他units,弱依賴,

                 Conficts:定義units之間的衝突


             Service段的常用選項:

                 TYPE:用於定義影響ExecStart及相關參數的功能的unit進程啓動類型

                     類型:

                        simple

                        forking

                        oneshot

                        dbus

                        notify

                        idle

                 EnvironmentFile:環境配置文件

                 ExecStart:指明啓動unit要運行的命令或腳本,ExecStartPre、ExecStartPost

                 ExecStop:指明停止unit要運行的命令或腳本,

                 Restart:指明要重啓unit要運行的命令或腳本


             Install段的常用選項:

                 Alias:當前unit的別名

                 RequiredBy:被哪些unit所依賴,強依賴

                 WantedBY:被哪些unit所依賴,弱依賴


        注意:對於新創建的unit文件或修改了的unit文件,要通知systemd重載此配置文件

              #systemctl daemon-reload 


 配置nginx啓動示例:

        [Unit]

        Description=nginx

        After=network.target


       [Service]

       Type=forking

       ExecStart=/usr/local/nginx/sbin/nginx

       ExecReload=/usr/local/nginx/sbin/nginx -s reload

       ExecStop=/usr/local/nginx/sbin/nginx -s quit

       PrivateTmp=true


       [Install]

       WantedBy=multi-user.target


2、描述awk命令用法及函數示例


AWK是一個優良的文本處理工具,Linux及Unix環境中現有的功能最強大的數據處理引擎之一,而我們日常所使用的awk是gawk(GNU awk).

基本用法:

 gawk [options] ‘program’ FILE...

      program:PATTERN{ACTION STATEMENTS}

         語句之間用分號“;”分割


         print printf


         選項:

            -F:指明輸入時用到的字段分隔符

            -v var=value:自定義變量



        1.print


           print item1,item2,...


           要點:

               (1)逗號分隔符

               (2)輸出的各item可以是字符串,也可以是數值:當前記錄的字段、變量或awk的表達式

               (3)如省略item,相當於print $0,即輸出所有


        2.變量


           2.1內建變量

             FS:input field seperator,默認爲空白字符

             OFS:output field seperator,默認爲空白字符

             RS:input record seperator,輸出時的換行符

             ORS:output record seperator,輸入時的換行符


             NF:number of field,字段數量

                 注意:{print NF}:表示打印每一行字段數量

                       {print $NF}:表示打印每一行的最後一個字段

             NR:number of record,行數

             FNR:各文件分別計數,行數


             FILENAME:當前文件名

             ~]# awk '{print FILENAME}' /etc/fstab 


             ARGC:命令行參數的個數

                ~]# awk '{print ARGC}' /etc/fstab /etc/passwd

             ARGV:數組,保存的是命令行所給定的各參數

                ~]# awk 'BEGIN{print ARGV[2]}' /etc/fstab /etc/passwd


           2.2自定義變量

             (1)-v var=value 


                 變量名區分字符大小寫


             (2)在program中直接定義


       3.printf命令


            格式化地輸出:printf FORMAT,item1,item2,...


                (1)FORMAT必須給出

                (2)不會自動換行,需要顯示給出換行控制符:\n

                (3)FORMAT中需要分別爲後面的每個item指定一個格式化符號


                格式符:

                    %c:顯示字符的ASCII碼

                    %d,%i:顯示十進制整數

                    %e,%E:科學計數法數值顯示

                    %f:顯示爲浮點數

                    %g,%G:以科學計數法或浮點形式顯示數值

                    %s:顯示字符串

                    %u:無符號整數

                    %%:顯示%自身


                示例:

                   ~]# awk -F: '{printf "Username: %s,UID: %d\n",$1,$3}' /etc/passwd 


                修飾符:

                   #[.#]:第一個#控制顯示的寬度,第二個#表示小數點後的精度

                     %3.1f


                   -:左對齊

                   +:顯示數值的符號


                示例:

                   ~]# awk -F: '{printf "Username: %-10s,UID: %d\n",$1,$3}' /etc/passwd 



       4.操作符


            算數操作符:

               x+y,x-y,x*y,x/y,x^y,x%y

               -x

               +x:轉換爲數值


            字符串操作符:沒有符號的操作符,字符串連接


            賦值操作符:

               =,<=,>=,<,>,==,!=

               ++,--


            模式匹配符:

               ~:是否匹配

               !~:是否不匹配


            邏輯操作符

               &&

               ||

               !


            函數調用:

               function_name(argu1,argu2,...)


            條件表達式:

               selector?if-true-expression:if-fales-expression


            示例:

               ~]# awk -F: '{$3>=1000?usertype="Common user":usertype="sysadmin or sysuser";printf "%10s:%-s\n",$1,usertype}' /etc/passwd


       

       5.PATTERN


           (1)empty:空模式,匹配每一行

           (2)/regular expression/:僅處理能夠被此處的模式所匹配到的行

                ~]# awk '/^UUID/ {print $3 }' /etc/fstab 

           (3)relational expression:關係表達式,結果有“真”有“假”,結果爲“真”時纔會被處理

               真:結果爲非0值,非空字符串

                  ~]# awk -F: '$3>=1000{print $1,$3}' /etc/passwd

                  ~]# awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd

           (4)line ranges:行範圍

               startline,endline: /pat1/,/pat2/


               注意:不支持直接給出數字的格式

                 ~]# awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd

           (5)BEGIN/END模式

               BEGIN{}:僅在開始處理文件中的文本之前執行一次

               END{}:j僅在文本處理完成之後執行一次

            示例:

               ~]# awk -F: 'BEGIN{print " username     uid \n ---------------------"}{print $1,$3}END{print "-------------------\n end    "}' 


/etc/passwd



        

       6.常用的action


           (1)Expression

           (2)Control statement:if,while等

           (3)Compound statement:組合語句

           (4)input statement

           (5)output statement



       7.控制語句


           if(condition) {statement}

           if(condition) {statement} else {statement}

           while(condition) {statement}

           do {statement} while {condition}

           for(expr1;expr2;expr3) {statement}

           break

           continue

           delete array[index]

           delete array

           exit

           { statement }



           7.1  if-else


              語法:if(condition) statement [else statement]


              示例:

                 ~]# awk -F: '{if($3>=100){printf"Common user: %s\n",$1} else {printf "sysadmin or sysuser: %s\n",$1}}' /etc/passwd


                 ~]# awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd


                 ~]# awk '{if(NF>2) print $0}' /etc/fstab 


                 ~]# df -h | awk -F[%] '/^\/dev/ {print $1}'| awk '{print $NF}'


              使用場景:對awk取得的整行或某個字段做條件判斷


           7.2 while循環


              語法:while(condition) statement

                   條件“真”,進入循環,條件“假”,退出循環


              使用場景:對一行內的多個字段逐一作類似處理時使用;對數組中的各元素逐一處理時使用


                 length()


              示例:

                 ~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {print $i,length($i);i++}}' /etc/grub2.cfg 


                 ~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=7) {print $i,length($i)};i++}}' /etc/grub2.cfg


           7.3 do-while循環


               語法: do statement while (condition)

                   意義:至少執行一次循環體



           7.4 for循環


               語法: for(expr1;expr2;expr3) statement


                   for(控制變量初始化;條件判斷表達式;控制變量的修正語句) (循環體)


               示例:

                   ~]# awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg


               特殊用法:

                   能夠遍歷數組中的元素

                       語法:for(var in array) (for-body)


           7.5 switch語句


               語法: switch(表達式) {case VALUE or /REGEXP1/: statement; case VALUE2 or /REGEXP2/: statement;...; default:statement}


           7.6 break和continue

                break [n]

                continue


           7.7 next

              

               示例:求用戶ID爲偶數的用戶,顯示其用戶名以及ID

                 ~]# awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd


               提前結束對本行的處理而直接進入下一行



        8. array


               關聯數組:array[index-expression]


                   index-expression:

                      (1)可使用任意字符串

                      (2)如果某數組元素事先不存在,在引用時,awk會自動創建此元素,並將其值初始化爲“空串”


                      若要判斷數組中是否存在元素,要使用“index in array”格式進行


                      weekdays[mon]="monday"


                       ~]# awk 'BEGIN{weekdays[mon]="monday";weekdays[tue]="tuesday";print weekdays[tue]}'


                       若要遍歷數組中的每個元素,需要使用for循環

                           for(var in array) {for-body}


                       ~]# awk 'BEGIN{weekdays["mon"]="monday";weekdays["tue"="tuesday";for(i in weekdays){print weekdays[i]}}'


                       注意:var會遍歷array的每個索引

                       state["LISTEN"]++

                       state["EASTABLISHED"]++


                       ~]# netstat -tan | awk '/^tcp\>/{state["LISTEN"]++}END{for(i in state) {print i,state[i]}}'


                       ~]# awk '{ip[$1]++}END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log 



            練習1.統計/etc/fstab文件中每個文件系統類型出現的次數

               ~]# awk '/^\/dev/{fs[$3]++}END{for(i in fs) {print i,fs[i]}}' /etc/fstab 


            練習2.統計指定文件中每個單詞出現的次數

               ~]# awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}' /etc/fstab 

          

        9. 函數


               9.1 內置函數

                  數值處理:

                    rand():返回0和1直接的一個隨機數

                       ~]# awk 'BEGIN{print rand()}'


                  字符串處理:

                    length([s]):返回指定字符串的長度

                    sub(r,s,[t]):以r表示的模式來查找t所表示的字符中的匹配的內容,並將其第一次出現替換爲s所表示的內容  

                    gsub(r,s,[t]):以r表示的模式來查找t所表示的字符中的匹配的內容,並將其所有出現全部替換爲s所表示的內容 


                    split(s,a[r]):以r爲分隔符切割字符s,並將其切割後的結果保存至a所表示的數組中


               9.2 自定義函數

                  《sed和awk》


          10 內置字符串函數


                gsub(r,s)    在整個$0中用s替代r

                gsub(r,s,t)    在整個t中用s替代r

                index(s,t)    返回s中字符串t的第一位置

                length(s)    返回s長度

                match(s,r)    測試s是否包含匹配r的字符串

                split(s,a,fs)    在fs上將s分成序列a

                sprint(fmt,exp)    返回經fmt格式化後的exp

                sub(r,s)    用$0中最左邊最長的子串代替s

                substr(s,p)    返回字符串s中從p開始的後綴部分

                substr(s,p,n)    返回字符串s中從p開始長度爲n的後綴部分 詳細說明一下各個函數的使用方法。


            示例:

               ~]# cat tpm.txt | awk '{print substr($2,2,5)}'  #截取第二列字符串中2-5位置的字符









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章