awk與systemd

GNU awkGNU awk

文本處理三工具:grep,sed,awk
    grep,egrep,fgrep:文本過濾工具
    sed:行(流)編輯器
    awk:報告生成器,格式化文本輸出

awk
 awk: Aho, Weinberger, Kernighan,報告生成器,格式化文本輸出
 有多種版本:New awk(nawk),GNU awk(gawk)
 gawk -模式掃描和處理語言

基本用法:
    awk [options] ‘program’ var=value file…
    awk [options] -f programfile var=value file…
    awk [options] 'pattern{ action;… }' file …
    通常由:BEGIN語句塊、能夠使用模式匹配的通用語句塊、END語句塊,共3部分組成
        program通常是被單引號或雙引號中,語句之間用分號分割
    選項:

awk工作原理
 第一步:執行BEGIN{action $1,$2..}語句塊中的語句
 第二步:從文件或標準輸入(stdin)讀取一行,然后執行pattern{action $1,$2..}語句塊,它逐行掃描文件,從第一行到最后一行重復這個過程,直到文件全部被讀取完畢。
 第三步:當讀至輸入流末尾時,執行END{action;…}語句塊
 BEGIN語句塊在awk開始從輸入流中讀取行之前被執行,這是一個可選的語句塊,比如變量初始化、打印輸出表格的表頭等語句通??梢詫懺贐EGIN語句塊中
 pattern語句塊中的通用命令是最重要的部分,也是可選的。如果沒有提供pattern語句塊,則默認執行{print},即打印每一個讀取到的行,awk讀取的每一行都會執行該語句塊
 END語句塊在awk從輸入流中讀取完所有的行之后即被執行,比如打印所有行的分析結果這類信息匯總都是在END語句塊中完成,它也是一個可選語句塊

1、awk [options] 'pattern{action $1,$2..}' file…
 pattern和action:
       pattern部分決定動作語句何時觸發及觸發事件(BEGIN,END)
       action對數據進行處理,放在{}內指明(print, printf)
 分割符、域和記錄
     段稱為域,行稱為記錄
     以逗號作為域標記分隔符,$1,$2..$n稱為域標識,$0為所有域。
     以空格作為域標記分割符時,將會被認為一個域
         注意:
              文件的每一行稱為記錄
             和shell中變量$符含義不同
             放在引號內將被認為普通字符串
             省略$1,$2..,則默認執行$0的操作。
             輸出的各$1,$2..可以字符串,也可以是數值;當前記錄的字段、變量或awk的表達式

    練習:
        awk '{print "hello,awk"}'
        awk -F: '{print}' /etc/passwd
        awk -F: ‘{print “wang”}’ /etc/passwd
        awk -F: ‘{print $1}’ /etc/passwd
        awk -F: ‘{print $0}’ /etc/passwd
        awk -F: ‘{print $1”\t”$3}’ /etc/passwd
        tail -3 /etc/fstab |awk ‘{print $2,$4}’

2、awk變量:
    自定義變量
      -v var='value': 自定義變量(一個-v定義一個變量)
         (1) -v var=value變量名區分字符大小寫
         (2)在program中直接定義
             示例:
                awk -v test='hello gawk' '{print test}' /etc/fstab
                awk -v test='hello gawk' 'BEGIN{print test}'
                awk 'BEGIN{test="hello,gawk";print test}'
    內置變量
      -v var='value': 定義內置變量值(一個-v定義一個變量)
       FS:輸入字段分隔符,默認為任意個空白字符
           -F:指明輸入時用到的字段分隔符,默認為任意個空格
                awk -v FS=':' '{print $1,$3,$7}’ /etc/passwd
                awk -F: '{print $1,$3,$7}’ /etc/passwd
       OFS:輸出字段分隔符,默認為單個空白字符
            awk -v FS=‘:’ -v OFS=‘::’ '{print $1,$3,$7}’ /etc/passwd
       RS:輸入記錄分隔符,指定輸入時的換行符,原換行符仍有效
            awk -v RS=' ' ‘{print}’ /etc/passwd
       ORS:輸出記錄分隔符,輸出時用指定符號代替換行符,原換行符仍有效
            awk -v RS=' ' -v ORS='###' '{print}' /etc/passwd
       NF:顯示每行的字段數量
            awk -F:‘{print NF}’ /etc/fstab,引用內置變量不用$
            awk -F: '{print $(NF-1)}' /etc/passwd
       NR:顯示每行的行號,用于顯示行數
            awk '{print NR}' /etc/fstab; awk END'{print NR}' /etc/fstab
        FNR:顯示每行的行號,多文件分別顯示
            awk '{print FNR}' /etc/fstab /etc/inittab
        FILENAME:當前文件名,文件有多少行就顯示多少遍文件名
            awk '{print FILENAME}’ /etc/fstab
        ARGC:命令行參數的個數
            awk '{print ARGC}’ /etc/fstab /etc/inittab
            awk ‘BEGIN {print ARGC}’ /etc/fstab /etc/inittab
        ARGV:數組,保存的是命令行所給定的各參數
            awk ‘BEGIN {print ARGV[0]}’ /etc/fstab /etc/inittab
            awk ‘BEGIN {print ARGV[1]}’ /etc/fstab /etc/inittab
            第一個參數awk,第二個參數/etc/fstab,第三個參數/etc/inittab

3、printf命令
   格式化輸出:printf “FORMAT”, $1,$2…
        (1) 必須指定FORMAT
        (2) 不會自動換行,需要顯式給出換行控制符,\n
        (3) FORMAT中需要分別為后面每個item指定格式符
   格式符:與item一一對應
        %c: 顯示字符的ASCII碼
        %d, %i: 顯示十進制整數
        %e, %E:顯示科學計數法數值
        %f:顯示為浮點數
        %g, %G:以科學計數法或浮點形式顯示數值
        %s:顯示字符串
        %u:無符號整數
        %%: 顯示%自身
   修飾符:
        #[.#]:第一個數字控制顯示的寬度;第二個#表示小數點后精度,%3.1f
        -: 左對齊(默認右對齊)%-15s
        +:顯示數值的正負符號%+d
          示例:
             awk -F: ‘{printf "%s",$1}’ /etc/passwd
             awk -F: ‘{printf "%s\n",$1}’ /etc/passwd
             awk -F: ‘{printf "Username: %s\n",$1}’ /etc/passwd
             awk -F: ‘{printf "Username: %s, UID:%d\n",$1,$3}’ /etc/passwd
             awk -F: ‘{printf "Username: %15s, UID:%d\n",$1,$3}’ /etc/passwd
             awk -F: ‘{printf "Username: %-15s, UID:%d\n",$1,$3}’ /etc/passwd

    操作符
     算術操作符:
         x+y, x-y, x*y, x/y, x^y, x%y
         -x: 轉換為負數
         +x: 轉換為數值
     字符串操作符:沒有符號的操作符,字符串連接
     賦值操作符:
         =, +=, -=, *=, /=, %=, ^=
         ++, —
     比較操作符:
         >, >=, <, <=, !=, ==
     模式匹配符:
         ~:左邊是否和右邊匹配包含
         !~:是否不匹配
            示例
                cat /etc/passwd|awk'$0 ~ /root/'|wc-l
                cat /etc/passwd|awk'$0 !~ /root/'|wc-l

     邏輯操作符:&&,||,!
             示例:
                 awk -F: '$3>=0 && $3<=1000 {print $1}' /etc/passwd
                 awk -F: '$3 ==0 || $3>=1000 {print $1}' /etc/passwd
                 awk -F: ‘!($3==0){print $1}' /etc/passwd
                 awk -F: '!($3>=500) {print $3}}' /etc/passwd

     函數調用:
         function_name(argu1, argu2, …)
     條件表達式:
         selector?if-true-expression:if-false-expression
             示例:
                awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or SysUser";printf"%-15s:%-s\n",$1,usertype}' /etc/passwd

5、PATTERN:根據pattern條件,過濾匹配的行,再做處理
    (1)如果未指定:空模式,匹配每一行
    (2) /regular expression/:僅處理能夠模式匹配到的行,需要用/ /括起來
        示例:
          awk '/^UUID/{print $1}' /etc/fstab
          awk '!/^UUID/{print $1}' /etc/fstab

    (3) relational expression: 關系表達式;結果有“真”有“假”;結果為“真”才會被處理;
          真:結果為非0值或非空字符串
          假:結果為空字符串
           示例:
              awk -F: '$3>=1000{print $1,$3}' /etc/passwd
              awk -F: '$3<1000{print $1,$3}' /etc/passwd
              awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
              awk -F: '$NF~/bash$/{print $1,$NF}' /etc/passwd
              seq 10 | awk 'i=!i'
              seq 10 | awk 'i=!i'

     4) line ranges:行范圍
        startline,endline:/pat1/,/pat2/不支持直接給出數字格式
          示例:
            awk -F: '/^root/,/^nobody/{print $1}' /etc/passwd
            awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd

    (5)BEGIN/END模式
        BEGIN{}: 僅在開始處理文件中的文本之前執行一次
        END{}:僅在文本處理完成之后執行一次
            示例
               awk -F : 'BEGIN {print "USER USERID"} {print $1":"$3} END{print "end file"}' /etc/passwd
               awk -F : '{print "USER USERID“;print $1":"$3} END{print "end file"}' /etc/passwd
               awk -F: 'BEGIN{print " USER UID \n —————-"}{print $1,$3}' /etc/passwd
               awk -F: 'BEGIN{print " USER UID \n —————-"}{print $1,$3}'END{print "=============="} /etc/passwd

6、action分類
     (1) Expressions:算術,比較表達式等
     (2) Control statements:if, while等
     (3) Compound statements:組合語句
     (4) input statements:輸入語句
     (5) output statements:輸出語句

     {statements;…}                                                 組合語句
     if(condition) statements;…                                     單分支if語句
     if(condition) {statements;…} else {statements;…}                 雙分支if語句
     while(conditon) {statments;…}                                 while循環
     do {statements;…} while(condition)                             do循環(無論條件如何,先執行一遍循環體)
     for(expr1;expr2;expr3) {statements;…}                            for循環
     break                                                         中斷循環
     continue                                                         中斷本次循環(重新開始循環)
     delete array[index]                                             刪除數組中的指定元素
     delete array                                                     刪除整個屬組
     exit                                                             退出語句

    if語句
      if(condition) statements;…  單分支
      if(condition) {statement;…} else {statement;…}  雙分支
      if(condition1) {statement1} else if(condition2) {statement2} else {statement3}  三分支
       使用場景:對awk取得的整行或某個字段做條件判斷
         示例:
            awk -F: '{if($3>=1000) print $1,$3}' /etc/passwd
            awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd
            awk '{if(NF>5) print $0}' /etc/fstab
            awk -F: '{if($3>=1000) {printf "Common user: %s\n",$1} else {printf "root or Sysuser: %s\n",$1}}' /etc/passwd
            df -h | awk -F[%] '/^\/dev/{print $1}'| awk '{if($NF>=80) print $1}'
            awk 'BEGIN{ test=100;if(test>90) { print "very good";} else if(test>60) { print "good";} else { print "no pass";}}'

    while循環
     while(condition) statement     條件“真”,進入循環;條件“假”,退出循環
     使用場景:
            對一行內的多個字段逐一類似處理時使用
            對數組中的各元素逐一處理時使用
        示例:
          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

    do-while循環
       do statement while(condition)    無論真假,至少執行一次循環體
       示例:
             awk 'BEGIN{ total=0;i=0;do{ total+=i;i++;}while(i<=100);print total}'

    for循環
        for(expr1;expr2;expr3) statement
        for(variable assignment;condition;iterationprocess) {for-body}
                變量初始化    條件判斷  變量修正表達式   循環體
         示例:
            awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg    

       特殊用法:for(var in array) {for-body}  遍歷數組中的元素;
            
    性能比較
     #time (awk 'BEGIN{ total=0;for(i=0;i<=10000;i++){total+=i;};print total;}')
     #time(total=0;for i in $(seq 10000);do total=$(($total+i));done;echo $total)

    switch語句
     switch(expression) {case VALUE1: statement; case VALUE2: statement; …; default: statement}
     switch(expression) {case /REGEXP1/: statement; case /REGEXP2/: statement; …; default: statement}

    break和continue
    break [n]
    continue [n]
        示例:
             awk ‘BEGIN{sum=0;for(i=1;i<=100;i++) {if(i%2==0){continue}sum+=i}print sum}‘
             awk ‘BEGIN{sum=0;for(i=1;i<=100;i++) {if(i==11){break}sum+=i}print sum}‘

    next  提前結束對本行處理而直接進入下一行處理(awk自身循環)
          awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd

7、awk數組
 array[index-expression] 關聯數組
   index-expression 索引表達式
     (1) 可使用任意字符串;字符串要使用雙引號括起來
     (2) 如果某數組元素事先不存在,在引用時,awk會自動創建此元素,并將其值初始化為“空串”
         若要判斷數組中是否存在某元素,要使用“index in array”格式進行遍歷
            示例:
             awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";print weekdays["mon"]}'
             awk '!a[$0]++' dupfile
       若要遍歷數組中的每個元素,要使用for循環
       for(var in array) {for-body}
              注意:var會遍歷array的每個索引
             示例:
                 awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays) {print weekdays[i]}}'
                 netstat -tan | awk '/^tcp\>/{state[$NF]++}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

8、awk函數
      內置函數
         數值處理:
            rand():返回0和1之間一個隨機數
                示例:awk'BEGIN{srand(); for (i=1;i<=10;i++) print int(rand()*100) }'
           字符串處理:
             length([s]):返回指定字符串的長度
             sub(r,s,[t]):對t字符串進行搜索r表示的模式匹配的內容,并將第一個匹配的內容替換為s
                示例:
                    echo "2008:08:08 08:08:08" | awk 'sub(/:/,"",$1)'
               gsub(r,s,[t]):對t字符串進行搜索r表示的模式匹配的內容,并全部替換為s所表示的內容
                示例:echo "2008:08:08 08:08:08" | awk 'gsub(/:/,"",$1)'
             split(s,array,[r]):以r為分隔符切割字符s,并將切割后的結果保存至array所表示的數組中
                示例:
                    netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++} END{for (i in count) {print i,count[i]}}'

        自定義函數
     格式:
        function name ( parameter, parameter, … ) {
          statements
          return expression
        }
         示例:
        #cat fun.awk
        function max(v1,v2) {
          v1>v2?var=v1:var=v2
          return var
        }
        END{a=3;b=2;print max(a,b);}
        #awk -f fun.awktestfile

9、awk中調用shell命令
    system命令
      空格是awk中的字符串連接符,如果system中需要使用awk中的變量可以使用空格分隔,或者說除了awk的變量外其他一律用""引用起來。
        示例:
            awk BEGIN'{system("hostname") }'
            awk'BEGIN{a=12; system("echo " a) }'

    awk腳本
      將awk程序寫成腳本,直接調用或執行
          示例:
          #cat f1.awk
          if($3>=1000)print $1,$3}
          #awk -F: -f f1.awk /etc/passwd
          #cat f2.awk
          #!/bin/awk -f
          #this is a awk script
          {if($3>=1000)print $1,$3}
          #chmod +x f2.awk
          #f1.awk -F: /etc/passwd

    向awk腳本傳遞參數
    格式:awk.awk var=value var2=value2… Inputfile
        示例:
          #cat f2.awk
          #!/bin/awk -f
          {if($3 >=min && $3<=max)print $1,$3}
          #f2.awk -F: min=100 max=200 /etc/passwd

練習
 1、統計/etc/fstab文件中每個文件系統類型出現的次數
     awk '/^UUID/{fs[$3]++}END{for(i in fs) {print i,fs[i]}}' /etc/fstab
 2、統計/etc/fstab文件中每個單詞出現的次數;
     awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}' /etc/fstab
管理systemd

  CentOS7啟動
  Unit介紹
  服務管理和查看
  啟動排錯
  破解口令
  修復grub2

systemd
  POST –> Boot Sequence –> Bootloader –> kernel +initramfs(initrd) –> rootfs –> /sbin/init
    init:
      CentOS 5: SysV init
      CentOS 6: Upstart
      CentOS 7: Systemd

Systemd:系統啟動和服務器守護進程管理器,負責在系統啟動或運行時,激活系統資源,服務器進程和其它進程

Systemd新特性:
  系統引導時實現服務并行啟動
  按需啟動守護進程
  自動化的服務依賴關系管理
  同時采用socket式與D-Bus總線式激活服務
  系統狀態快照

核心概念:unit
  unit表示不同類型的systemd對象,通過配置文件進行標
  識和配置;文件中主要包含了系統服務、監聽socket、保存的
  系統快照以及其它與init相關的信息

配置文件:
  /usr/lib/systemd/system:每個服務最主要的啟動腳本設置,類似于之前的/etc/init.d/
  /run/systemd/system:系統執行過程中所產生的服務腳本,比上面目錄優先運行
  /etc/systemd/system:管理員建立的執行腳本,類似于/etc/rc.d/rcN.d/Sxx類的功能,比上面目錄優先運行

Unit類型
  Systemctl -t help   查看unit類型
       類型            擴展名                 意義
    Service unit         .service            用于定義系統服務
    Target unit         .target            用于模擬實現“運行級別”
    Device unit             .device         用于定義內核識別的設備
    Mount unit             .mount         定義文件系統掛載點
    Socket unit         .socket            用于標識進程間通信用的socket文件,也可在系統啟動時,延遲啟動服務,實現按需啟動
    Snapshot unit        .snapshot        管理系統快照
    Swap unit             .swap            用于標識swap設備
    Automount unit         .automount        文件系統的自動掛載點
    Path unit             .path            用于定義文件系統中的一個文件或目錄使用,常用于當文件系統變化時,延遲激活服務,如:spool 目錄

關鍵特性:
  基于socket的激活機制:socket與服務程序分離
  基于d-bus的激活機制:
  基于device的激活機制:
  基于path的激活機制:
  系統快照:保存各unit的當前狀態信息于持久存儲設備中
  向后兼容sysv init腳本
不兼容:
  systemctl命令固定不變,不可擴展
  非由systemd啟動的服務,systemctl無法與之通信和控制

管理系統服務:
  CentOS 7: service unit
  注意:能兼容早期的服務腳本
 
命令:systemctl COMMAND name.service
 
  重載或重啟服務:systemctl reload-or-restart name.service 先加載,再啟動
  重載或條件式重啟服務:systemctl reload-or-try-restart name.service
 
  禁止自動和手動啟動:systemctl mask name.service
  取消禁止:systemctl unmask name.service
 
  查看所有已經激活的服務:systemctl list-units –type|-t service
   
 chkconfig命令的對應關系:
  啟動: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
                 systemctl is-active name.service  查看某服務當前激活與否的狀態
  條件式重啟:service name condrestart ==> systemctl try-restart name.service  已啟動才重啟,否則不做操作
 
  設定某服務開機自啟:chkconfig name on ==> systemctl enable name.service
  設定某服務開機禁止啟動:chkconfig name off ==> systemctl disable name.service
  查看服務是否開機自啟chkconfig name -list ==>  systemctl is-enabled name.service
  查看所有服務的開機自啟狀態:chkconfig –list ==> systemctl list-unit-files –type service
 
  查看服務的依賴關系:systemctl list-dependencies name.service
  殺掉進程:systemctl kill 進程名
 
服務狀態
  systemctl list-units –type service –all顯示狀態
    loaded:Unit配置文件已處理
    active(running):一次或多次持續處理的運行
    active(exited):成功完成一次性的配置
    active(waiting):運行中,等待一個事件
    inactive:不運行
    enabled:開機啟動
    disabled:開機不啟動
    static:開機不啟動,但可被另一個啟用的服務激活

  顯示所有單元狀態systemctl 或 systemctl list-units
  只顯示服務單元的狀態systemctl –type=service
 
 
  示例:
    顯示sshd服務單元systemctl status sshd.service -l
    驗證sshd服務當前是否活動systemctl is-active sshd
    啟動,停止和重啟sshd服務
      systemctl start sshd.service
      systemctl stop sshd.service
      systemctl restart sshd.service
    重新加載配置systemctl reload sshd.service
    列出活動狀態的所有服務單元systemctl list-units –type=service
    列出所有服務單元systemctl list-units –type=service –all
    查看服務單元的啟用和禁用狀態systemctl list-unit-files –type=service
    列出失敗的服務systemctl –failed –type=service
    列出依賴的單元systemctl list-dependencies sshd
    驗證sshd服務是否開機啟動systemctl is-enabled sshd
    禁用network,使之不能自動啟動,但手動可以systemclt disable network
    啟用network systemctl enable network
    禁用network,使之不能手動或自動啟動systemclt mask network
    啟用network systemctl umask network
 
 
運行級別 target units:
unit配置文件: .target
  ls /usr/lib/systemd/system/*.target
  systemctl list-unit-files –type target –all
  運行級別:
      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
    查看依賴性:systemctl list-dependencies graphical.target
 
  級別切換:init N ==> systemctl isolate name.target
    示例:systemctl isolate multi-user.target
    注:只有/lib/systemd/system/*.target文件中AllowIsolate=yes 才能切換(修改文件需執行systemctl daemon-reload才能生效)
  查看當前運行級別:
    runlevel who -r
    systemctl list-units –type target
    ls -l /etc/systemd/system/default.target
  獲取默認運行級別:/etc/inittab ==> systemctl get-default
  修改默認級別:
      /etc/inittab配置文件修改為systemctl set-default name.target
      systemctl set-default multi-user.target
      手動刪除舊軟鏈接并創建新軟鏈接
  切換至緊急救援模式:systemctl rescue
  切換至emergency模式:systemctl emergency

傳統命令init,poweroff,halt,reboot都成為systemctl的軟鏈接
  關機:systemctl halt、systemctl poweroff
  重啟:systemctl reboot
  掛起:systemctl suspend  不保存內存信息
  休眠:systemctl hibernate  保存內存信息
  休眠并掛起:systemctl hybrid-sleep
 
CentOS7引導順序
  UEFi或BIOS初始化,運行POST開機自檢
  選擇啟動設備
  引導裝載程序, centos7是grub2
  加載裝載程序的配置文件:
     /boot/grub2/grub.cfg  grub主配置文件
     /etc/grub.d/
     /etc/grub–>/boot/grub2/grub.cfg
     /etc/default/grub  配置文件的模板文件,修改后執行grub2-mkconfig -o /boot/grub2/grub.cfg
  加載initramfs驅動模塊
  加載內核選項
  內核初始化,centos7使用systemd代替init
  執行initrd.target所有單元,包括掛載/etc/fstab
  從initramfs根文件系統切換到磁盤根目錄
  systemd執行默認target配置,配置文件
    /etc/systemd/default.target
    /etc/systemd/system/
    
CentOS7引導順序
  systemd執行sysinit.target初始化系統及basic.target準備操作系統
  systemd啟動multi-user.target下的本機與服務器服務
  systemd執行multi-user.target下的/etc/rc.d/rc.local
  Systemd執行multi-user.target下的getty.target及登入服務
  systemd執行graphical需要的服務
 
service unit文件格式
  /etc/systemd/system:系統管理員和用戶使用
  /usr/lib/systemd/system:發行版打包者使用
      以 “#” 開頭的行后面的內容會被認為是注釋
      相關布爾值,1、yes、on、true 都是開啟,0、no、off、false 都是關閉。
      時間單位默認是秒,所以要用毫秒(ms)分鐘(m)等請顯式說明
      
    service unit file文件通常由三部分組成:
      [Unit]:定義與Unit類型無關的通用選項;用于提供unit的描述信息、unit行為及依賴關系等
      [Service]:與特定類型相關的專用選項;此處為Service類型
      [Install]:定義由“systemctl enable”以及"systemctl disable“命令在實現服務啟用或禁用時用到的一些選項
      
      Unit段的常用選項:
          Description:描述信息
          After: 定義unit的啟動次序,表示當前unit應該晚于哪些unit啟動,其功能與Before相反
          Requires: 依賴到的其它units,強依賴,被依賴的units無法激活時,當前unit即無法激活
          Wants: 依賴到的其它units,弱依賴
          Conflicts: 定義units間的沖突關系
      Service段的常用選項:
          Type: 定義影響ExecStart及相關參數的功能的unit進程啟動類型
          simple: 默認值,這個daemon主要由ExecStart接的指令串來啟動,啟動后常駐于內存中
          forking: 由ExecStart啟動的程序透過spawns延伸出其他子程序來作為此daemon的主要服務。原生父程序在啟動結束后就會終止
          oneshot: 與simple類似,不過這個程序在工作完畢后就結束了,不會常駐在內存中
          dbus: 與simple類似,但這個daemon必須要在取得一個D-Bus的名稱后,才會繼續運作.因此通常也要同時設定BusNname= 才行
          notify: 在啟動完成后會發送一個通知消息。還需要配合NotifyAccess 來讓 Systemd 接收消息
          idle: 與simple類似,要執行這個daemon必須要所有的工作都順利執行完畢后才會執行。這類的daemon通常是開機到最后才執行即可的服務
          EnvironmentFile: 環境配置文件
          ExecStart: 指明啟動unit要運行命令或腳本的絕對路徑
          ExecStartPre: ExecStart前運行
          ExecStartPost: ExecStart后運行
          ExecStop: 指明停止unit要運行的命令或腳本
          Restart: 當設定Restart=1 時,則當次daemon服務意外終止后,會再次自動啟動此服務
      Install段的常用選項:
          Alias: 別名,可使用systemctl command Alias.service
          RequiredBy: 被哪些units所依賴,強依賴
          WantedBy: 被哪些units所依賴,弱依賴
          Also: 安裝本服務的時候還要安裝別的相關服務
    注意: 對于新創建的unit文件,或者修改了的unit文件,要通知systemd重載此配置文件,而后可以選擇重啟   systemctl daemon-reload
    
      示例:
      vim /etc/systemd/system/bak.service
        [Unit]
        Description=backup my etc
        Requires=atd.service
        [Service]
        Type=simple
        ExecStart=/bin/bash -c "echo /testdir/bak.sh|at now"
        [Install]
        WantedBy=multi-user.target
        systemctl daemon-reload
        systemctl start bak

設置內核參數
  設置內核參數,只影響當次啟動
  啟動時,在linux16行后添加
    systemd.unit=desired.target
    systemd.unit=emergency.target
    systemd.unit=recure.target
  注:recure.target 比emergency 支持更多的功能,例如日志等,無法進入recure時進入emergency
 
啟動排錯
  文件系統損壞
先嘗試自動修復,失敗則進入emergency shell,提示用戶修復
  在/etc/fstab不存在對應的設備和UUID
等一段時間,如不可用,進入emergency shell
  在/etc/fstab不存在對應掛載點
systemd 嘗試創建掛載點,否則提示進入emergency shell.
  在/etc/fstab不正確的掛載選項
提示進入emergency shell

破解root口令
  啟動時任意鍵暫停啟動
  按e鍵進入編輯模式
  將光標移動linux16開始的行,添加內核參數rd.break
  按ctrl-x啟動
  mount -o remount,rw /sysroot
  chroot /sysroot
  passwd root
  touch /.autorelabel
 
修復GRUB2
  GRUB“the Grand Unified Bootloader”
引導提示時可以使用命令行界面
可從文件系統引導
  主要配置文件 /boot/grub2/grub.cfg
  修復配置文件
grub2-mkconfig > /boot/grub2/grub.cfg
  修復grub
grub2-install /dev/sda BIOS環境
grub2-install UEFI環境

練習
  為編譯安裝的httpd服務,實現service unit文件
  破解centos7 口令
  修改默認的啟動內核
  啟動時臨時禁用SELinux
  啟動時進入emergency模式
  刪除編譯安裝的新內核

原創文章,作者:anonymous,如若轉載,請注明出處:http://www.www58058.com/47864

(0)
anonymousanonymous
上一篇 2016-09-22
下一篇 2016-09-22

相關推薦

  • linux運維

    linux運維大綱,學習路線圖

    Linux干貨 2017-10-21
  • awk 的相關知識

    awk 介紹,基本用法,變量,格式化,操作符,條件判斷,循環,數組,函數等

    2018-01-01
  • CA和證書

    A與B雙方通信,需要通過簽證機構CA頒發證書,才可以互相信任,從而安全的進行數據傳輸。想要獲取證書,除了付費購買認證機構的證書,還可以自簽名獲取證書。 openssl命令可以搭建CA,實現自簽名證書。下面以三臺主機為例,模擬根CA、子CA的搭建,以及客戶端申請證書的過程。 一、搭建根CA /etc/pki/tls/openssl.cnf文件是openssl的…

    2017-09-10
  • 網絡基礎筆記

    網絡管理筆記 1. 網絡概念:     一組網絡設備或計算機,通過無形的規則鏈接起來的體系!    2. 應用程序種類:     (1)批處理應用程序:            FTP、TFTP、庫存更新    &nbsp…

    Linux干貨 2017-03-16
  • Linux常用文件管理命令

    常用文件管理命令 cat cat命令連接文件并打印到標準輸出設備上,cat經常用來顯示文件的內容 語法 cat(選項)(參數) 選項 -n或-number:有1開始對所有輸出的行數編號; -b或–number-nonblank:和-n相似,只不過對于空白行不編號; -s或–squeeze-blank:當遇到有連續兩行以上的空白行,就代換為一行的空白行; …

    2018-03-11
  • N26 – 第二周作業

    1、文件管理類命令和常用使用方法 2、bash命令執行后返回值,和目錄展開:     命令執行返回值,存儲在“$?”這個特殊變量內??梢允褂胑cho顯示或在shell腳本中引用。其中0表示正常執行完成,1-255表示不同的錯誤類型。     目錄展開的特殊符號:  &n…

    Linux干貨 2016-12-30

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-09-23 12:34

    總結的很全面,但是沒什么層次感,建議能進行一些層次化的劃分,即通過各個小標題來實現。

欧美性久久久久