美文网首页Linux
第八周《简述systemd的新特性及......》

第八周《简述systemd的新特性及......》

作者: N32_Diamond | 来源:发表于2018-10-10 11:20 被阅读103次

    一、简述systemd的新特性及unit常见类型分析,能够实现编译安装的如nginx\apache实现通过systemd来管理

    Systemd概述

    1.systemd是一种新的linux系统服务管理器,用于替换init系统,能够管理系统启动过程和系统服务,一旦启动起来,就将监管整个系统。在centos7系统中,PID1被systemd所占用;
    2.systemd可以并行地启动系统服务进程,并且最初仅启动确实被依赖的服务,极大减少了系统的引导时间,这也就是为什么centos7系统启动速度比centos6快许多的原因;
    3.systemctl 是 systemd 的主命令,用于管理系统及服务

    systemd的新特性:
    • 在系统引导时实现服务并行启动;
    • 能按需激活进程;
    • 能做系统状态快照;
    • 基于依赖关系定义服务控制逻辑;
    关键特性:(了解systemd的工作)
    • 基于socket的激活机制:socket与程序分离;
    • 基于bus的激活机制;
    • 基于设备device的激活机制: 能监控内核输出的硬件信息,当设备插入时一旦发现就创建设备文件,再自动挂载至某挂载点,如果挂载点不存在还能自动创建
    • 基于path的激活机制: 系统可监控某目录或文件是否存在,如果文件在了立即就能激活一个服务或进程;例如某服务运行中突然崩溃,崩溃时能创建一个log或lock文件;一旦发现这个lock文件立即激活一个程序如发送报告
    • 系统快照:能保存各unit的当前状态信息于持久存储设备中; 因为systemd的所有管理都是通过unit实现的,回滚时使用
    • 向后兼容sysv init脚本:所以放在/etc/init.d/服务脚本也一样能靠systemd来启动
    不兼容:
    • systemctl的命令是固定不变的;
      不能自定义命令,旧版能自定义如start、stop等命令,在脚本中可随意定义命令使用;而systemctl的命令是固定不变的
    • 非由systemd启动的服务,systemctl无法与之通信,无法控制此服务;
      例如启动web进程httpd,直接在命令行键入httpd也能启动,这种服务在CentOS 5和6上使用servcie httpd stop有时也能停掉服务,但是systemd就不行,但可自定义unit脚本来实现

    systemd核心概念:unit

    unit由其相关配置文件进行标识、识别和配置;文件中主要包含了系统服务、监听的socket、保存的快照以及其他与init相关的信息;这些配置文件主要保存在:

    /usr/lib/systemd/system
    /run/systemd/system
    /etc/systemd/system
    
    • unit的常见类型
    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 定义文件系统中的一文件或目录

    CentOS 7管理系统服务service unit:

    Control the systemd system and service manager
    systemctl [OPTIONS...] COMMAND [NAME...]
    
    动作 CentOS 6 CentOS 7
    启动 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 is-active NAME.service
    查看所有已激活的服务 systemctl list-units --t service
    查看所有服务(包含未激活) chkconfig --list systemctl list-units -t NAME.service -a
    设置服务开机自启 chkconfig NAME on systemctl enable NAME.service
    禁止服务开机自启 chkconfig NAME off systemctl disable NAME.service
    查看某服务是否能开机自启 chkconfig --list NAME systemctl is-enabled NAME.service
    禁止某服务设定为开机自启 systemctl mask NAME.service
    取消此禁止 systemctl umask NAME.service
    查看服务依赖关系 systemctl list-dependencies NAME.service

    管理target units:

    • 运行级别:
    运行级别 对应别名 服务名
    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

    service unit文件组织格式:

    文件通常由三段组成:

    [Unit]:主要定义与Unit类型无关的通用选项;用于提供当前unit的描述信息、unit行为及依赖关系;
    [Service]:与特定类型相关的专用选项;此处为service类型;
    (UNIT-TYPE,类似是什么就为相对应的名称)
    [Install]:定义由"systemctl enable"以及"systemctl disable"命令在实现服务启用或禁用时用到的一些选项;

    各部分释义:
    • [Unit] 段的常用选项:
         Description:描述信息; 意义性描述;
         After:定义unit的启动次序,表示当前unit应该晚于哪些unit启动;其功能与Before相反;
         Requies:依赖到的其它units;强依赖,被依赖的units无法激活时,当前unit即无法激活;
         Wants:依赖到的其它units;弱依赖;
         Conflicts:定义units间的冲突关系
    • [Service] 段的常用选项:
         Type:用于定义影响ExecStart及相关参数的功能的unit进程启动类型,其类型有:
         simple:默认值,执行ExecStart指定的命令,启动主进程
         forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出
         oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行
         dbus:当前服务通过D-Bus启动
         notify:当前服务启动完毕,会通知systemd再继续往下执行
         idle:若有其他任务执行完毕,当前服务才会运行
         EnvironmentFile:环境配置文件;
         ExecStart:指明启动unit要运行命令或脚本;
         ExecStartPre:在ExecStart之前运行;
         ExecStartPost:在ExecStart之后运行;
         ExecStop:指明停止unit要运行的命令或脚本;
         Restart:当设定Restart=1时,则当次daemon服务意外终止后,会再次自动启动。
    • [Install] 段的常用选项:
         Alias:别名,可使用systemctl command Alias.service;
         RequiredBy:被哪些units所依赖;
         WantedBy:被哪些units所依赖
    • 注意:对于新创建的unit文件或修改了的unit文件,要通知systemd重载此配置文件,通过命令 systemctl daemon-reload

    编译安装nginx\apache,并通过systemd来管理

    第一步--安装nginx基础依赖包并创建用户

    [root@wujunjie ~]# yum install pcre pcre-devel.x86_64 openssl-devel.x86_64 -y
    [root@wujunjie ~]# useradd nginx
    [root@wujunjie ~]# echo nginx|passwd --stdin nginx
    

    第二步--下载nginx并编译安装

    [root@wujunjie ~]#官网下载nginx包
    [root@wujunjie tools]# tar -xf nginx-1.14.0.tar.gz
    [root@wujunjie tools]# ls
    nginx-1.14.0  nginx-1.14.0.tar.gz
    [root@wujunjie tools]# cd nginx-1.14.0/
    [root@wujunjie nginx-1.14.0]# ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx1.4/ --with-http_stub_status_module --with-http_ssl_module
    [root@wujunjie nginx-1.14.0]# make && make install
    

    第三步--编辑配置文件

    [root@wujunjie ~]# cd /usr/lib/systemd/system
    [root@wujunjie system]# vim nginx.service
    [unit]
    Description=nginx
    After=network.target
    
    [Service]
    Type=forking 
    ExecStart=/usr/local/nginx1.4/sbin/nginx 
    ExecReload=/usr/local/nginx1.4/sbin/nginx -s reload
    ExecStop=/usr/local/nginx1.4/sbin/nginx -s stop
    
    [Install]
    WantedBy=multi-user.target
    

    第四步--最后重启;关闭nginx

    [root@wujunjie ~]# systemctl daemon-reload   #重新载入
    [root@wujunjie ~]# systemctl start nginx.service
    
    启动后效果图
    [root@wujunjie ~]# systemctl reload nginx.service
    [root@wujunjie ~]# systemctl stop nginx.service
    
    关闭后效果图

    二、描述awk命令用法及示例(至少3例)

    • 简介
      awk是一个强大的文本分析工具,相当于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。awk就是把文件逐行读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

    • 基本用法:
      gawk [options] 'program' FILE ...
      program: PATTERN{ACTION STATEMENTS}
      PATTERN:模式有多种,有地址定界作用,不同于sed或grep里面的概念;
      ACTION STATEMENTS:动作语句,可有多个语句,但语句之间用分号分隔;可认为是脚本里的调用命令,这不过用的是awk内建命令;如:print, printf(格式化输出)

    • 选项:
      -F:指明输入时用到的字段分隔符;
      -v VAR=VALUE: 自定义变量;

    • awk的基本处理机制
      一次从文件中读取一行文本,awk会对其自动进行切片,将每一行按字符串的分隔符进行切割。如这一行是this is a test,它会默认使用空白字符当分隔符,不管空了几个格,这样这一行就会成四片,一片中保存一个单词,而这四片在awk中可以使用一个变量来引用,这个变量相关于脚本中的位置参数$1,$2... ,$0表示这一整行。awk默认使用空白当分隔符,也可以指定分隔符。
      1、print

            print item1, item2, ...
      
    • 要点:
      (1) 逗号分隔符;
      (2) 输出的各item可以字符串,也可以是数值;当前记录的字段、变量(1,2,..)或awk的表达式;
      (3) 如省略item,相当于print $0; 即$0代表一整行内容,默认显示就为$0即整行内容;
      例:

      [root@wujunjie ~]# vim 12
      this is a,test 
      [root@wujunjie ~]# awk '{print $1,$2}' 12
      this is
      [root@wujunjie ~]# awk -F, '{print $1}' 12
      this is a
      [root@wujunjie ~]# awk '{print $0}' 12
      this is a,test
      

    2、变量
    2.1内建变量

    • 常用内置变量之记录变量
      FS:input field seperator,输入分隔符,默认为空白字符;
      OFS:output field seperator,输出分隔符,默认为空白字符;
      RS:input record seperator,输入时的换行符;一行为一条record;默认为行分隔符;
      ORS:output record seperator,输出时的换行符;一行为一条record;默认为行分隔符;

    • awk内置变量之数据变量
      NF:number of field,字段数量,即每行的字段数量;
      注意:{print NF}, {print $NF}的区别;
      NR:number of record, 行数;即对文件中的行进行编号;
      FNR:各文件分别计数;行数;
      FILENAME:当前文件名;即显示每行的文件名;
      ARGC:命令行中参数的个数;
      ARGV:数组,保存的是命令行中所给定的各参数;
      例:

      [root@wujunjie ~]# awk '{print NF}' /etc/issue
      1
      5
      0
      显示issue文件中每一行有多少字段;
      [root@wujunjie ~]# awk '{print NR}' /etc/issue
      1
      2
      3
      统计行数,显示行号;
      [root@wujunjie ~]# awk '{print NR}' 12 /etc/issue
      1
      2
      3
      4
      显示内容:两文件的总行数;
      [root@wujunjie ~]# awk '{print FNR}' 12 /etc/issue
      1
      1
      2
      3
      显示内容:两文件分别显示行数;
      

    2.2自定义变量
    (1) -v VAR=VALUE变量名区分字符大小写;
    (2) 在program中直接定义
    注意:定义变量,同bash中一样,用时定义即可;

    [root@wujunjie ~]# awk -v test='hello gawk' '{print test}' /etc/issue
    hello gawk
    hello gawk
    hello gawk
    文件此处没什么用,只有一个显示行数作用;即文件有12行显示了每行显示一次,显示了3行;
    

    3、printf命令(格式化输出命令)

    printf FORMAT, item1, item2, ...
    

    FORMAT是格式符,为每个item按位占一个位留一个特殊符号,所以item最终会显示在format指定格式符号的位置上;

    • 要点:
      (1) FORMAT必须给出;
      (2) 在显示多行文本时,不会自动换行,需要显式给出换行控制符,\n;
      (3) FORMAT中需要分别为后面的每个item指定一个格式化符号;
      格式符:
      %c: 显示字符的ASCII码;
      %d, %i: 显示十进制整数;decimal,integer;
      %e, %E: 科学计数法数值显示;
      %f:显示为浮点数;
      %g, %G:以科学计数法或浮点形式显示数值;
      %s:显示字符串;
      %u:无符号整数;
      %%: 显示%自身;
      例:

      [root@wujunjie ~]# head -3 /etc/passwd|awk -F: '{printf "%s\n",$1}'
      root
      bin
      daemon
      以字符串显示每行的第1字段;每字段一行;
      [root@wujunjie ~]# head -3 /etc/passwd|awk -F: '{printf "username:%s\n",$1}' 
      username:root
      username:bin
      username:daemon
      显示指定字符串即username:,同时以字符串显示每行的第1字段;每字段一行;
      

    修饰符:
    #[.#]:第一个数字控制显示的宽度;第二个#表示小数点后的精度;默认右对齐;
    %3.1f:3表示显示3个字符的宽度;
    -: 左对齐
    +:显示数值的符号
    4、操作符
    算术操作符:
    x+y, x-y, x*y, x/y, x^y(x的y次方), x%y(取模)
    -x:把整数转为负数;
    +x: 把字符串转换为数值;
    字符串操作符:
    没有符号的操作符,字符串连接(一般使用内建函数进行字符串切片)
    赋值操作符:
    =, +=, -=, *=, /=, %=, ^=(增强相赋值)
    ++, --(自增、自减运算)
    比较操作符:
    >, >=, <, <=, !=, ==(等值比较)
    模式匹配符:
    ~:左侧字符串是否能被右侧模式匹配;
    !~:左侧字符串是否不能被右侧模式匹配;
    逻辑操作符:将多个操作连接起来;
    && 与运算
    || 或运算
    ! 非运算
    函数调用:(这才是规范使用方式)

    function_name(argu1, argu2, ...)
    

    条件表达式:

    selector?if-true-expression:if-false-expression
    

    5、PATTERN(实现地址定界功能)
    (1) empty:空模式,匹配每一行;
    (2) /regular expression/:仅处理能够被此处的(正则表达式)模式匹配到的行;前面加!表示对模式过滤的条件取反;
    (3) relational expression: 关系(比较)表达式;结果有“真”有“假”;结果为“真”才会被处理;
    真:结果为非0值,非空字符串;
    假:0,空字符串;
    (4) line ranges:行范围,
    /pat1/,/pat2/:startline,endline表示地址定界;
    注意: 不支持直接给出数字的格式
    ~]# awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd
    (5) BEGIN/END模式
    BEGIN{program}: 仅在开始处理文件中的文本之前执行一次程序;显示表头;
    END{program}:仅在文本处理完成之后命令结束之前执行一次程序;
    6、常用的action
    (1) Expressions
    (2) Control statements:if, while等;
    (3) Compound statements:组合语句;
    (4) input statements
    (5) output statements
    7、控制语句
    if(condition) {statments}
    if(condition) {statments} else {statements}
    while(conditon) {statments}
    do {statements} while(condition)
    for(expr1;expr2;expr3) {statements}
    break
    continue
    delete array[index]
    delete array
    exit
    { statements }
    7.1 if-else语句,支持双分支if语句,完成条件判断;
    语法格式:if(condition) statement [else statement]
    语句如果有多个,需要用{}括起来;如果有else语句,各语句都要用{};
    使用场景:对awk取得的整行或某个字段做条件判断时使用;
    7.2 while循环
    语法格式:while(condition) statement
    条件“真”,进入循环;条件“假”,退出循环;语句如果有多个,需要用{}括起来;
    要根据初始条件判断为真或假,如果为假,则一次都不会执行;
    使用场景:对一行内的多个字段逐一进行类似处理时使用;或对数组中的各元素逐一处理时使用;
    7.3 do-while循环
    语法:do statement while(condition)
    7.4 for循环
    语法格式:for(expr1;expr2;expr3) statement
    expr1:控制变量初始化;
    expr2:条件判断;
    expr3:控制变量的数值修正表达式;
    for(variable assignment;condition;iteration process) {for-body}
    即:for(变量赋值;条件判断表达式;变量修正表达式) {循环体语句} 意义:无论条件真假,先执行一次,即至少执行一次循环体
    7.5 switch语句(在awk中用的不多)
    语法格式:
    switch(expression) {case VALUE1 or /REGEXP1/: statement1; case VALUE2 or /REGEXP2/: statement2; ...; default: statement}
    7.6 break和continue(不做详细介绍,用到时再说)
    break [n]:退出n层循环;
    continue:提前结束本轮循环,直接进入下一轮循环(即下一个字段);
    7.7 next
    在awk中能实现2重循环,awk本身可对文件每行循环,使用循环语句是为了遍历一行中的每个字段,或数组中的每个元素;
    next同continue一样,也是控制循环的,但是是控制awk的本身循环的;即提前结束对本行的处理而直接进入下一行;
    8、array数组
    关联数组:array[index-expression]
    index-expression:索引表达式
    (1) 可使用任意字符串;字符串要使用双引号;不能随便使用单引号;
    (2) 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空”;允许未经声明直接引用;
    若要判断数组中是否存在某元素,要使用"index in array"格式进行;

    三、描述awk函数示例(至少3例)

    • 3.1内置函数
      数值处理:
      rand():返回0和1之间一个随机数;在大多数awk实现中,包括gawk,每次运行awk时,rand()都会从相同的起始数字或种子开始生成数字。因此,程序每次运行时都会产生相同的结果。在一个AWK运行中,这些数字是随机的,但从运行到运行是可以预测的。这便于调试,但如果希望程序每次使用时都执行不同的操作,则必须将种子更改为每次运行中不同的值。要做到这一点,使用srand()

      例如:
      [root@wujunjie ~]# awk 'BEGIN{print rand()}'
      0.237788
      [root@wujunjie ~]# awk 'BEGIN{print rand()}'
      0.237788
      [root@wujunjie ~]# awk 'BEGIN{srand();print rand()}'
      0.343
      [root@wujunjie ~]# awk 'BEGIN{srand();print rand()}'
      0.0389058
      

    字符串处理:
    length([s]):返回指定字符串的长度;
    sub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其第一次出现替换为s所表示的内容;

      例如:
      [root@wujunjie ~]# awk -F: '{sub(o,O,$1)}' /etc/passwd
      把每行的第1字段中,第一次出现的小写o替换为大写O;注意:仅替换每行一次出现的;
    

    gsub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其所有出现的内容均替换为s所表示的内容;
    split(s,a[,r]):以r为分隔符切割字符s,并将切割后的结果保存至a所表示的数组中;数组元素从1开始编号;

      例如:
      [root@wujunjie ~]# netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}'
      192.168.32.1 1
      0.0.0.0 6
      显示来访的主机地址连接的次数;
    
    • 3.2自定义函数
      可参考《sed和awk》

    相关文章

      网友评论

        本文标题:第八周《简述systemd的新特性及......》

        本文链接:https://www.haomeiwen.com/subject/mgzeaftx.html