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开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中
 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.178linux.com/47864

评论列表(1条)

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

    总结的很全面,但是没什么层次感,建议能进行一些层次化的划分,即通过各个小标题来实现。